感觉是Creator的bug:修改mask的type后报错

只要用了maskNode.getComponent(cc.Mask).type = cc.Mask.Type.ELLIPSE;就报错,
改成mask.type = cc.Mask.Type.ELLIPSE;也报错
RECT也一样

报错信息如下:
Uncaught TypeError: Cannot read property ‘clear’ of null
app/engine/cocos2d/core/CCGame.js:359
_updateGraphics @ d:\SVN\Cocos\KillWoko\app\engine\cocos2d\core\CCGame.js:359:14 set @ localhost꞉7456/app/engine/bin/cocos2d-js-for-preview.js:30209:20

代码如下:

codeTest : function(){
    var maskNode = new cc.Node;
    var mask = maskNode.addComponent(cc.Mask);
    maskNode.parnt = this.gameLayer;
    maskNode.width = 50;
    maskNode.height = 50;
    maskNode.position = cc.v2(50,70);
    maskNode.getComponent(cc.Mask).type = cc.Mask.Type.ELLIPSE; //加这句就报错,不加就没事儿,就可以在mask的区域内显示下面这段代码里面加载的图片,只不过是默认的方形的mask

    var aaa = new cc.Node;
    var sprite = aaa.addComponent(cc.Sprite);
    sprite.spriteFrame = this.UIandEnemyAtlas.getSpriteFrame("fire");
    aaa.parent = maskNode;
    aaa.position = cc.v2(0, 0);

},

论坛看了一圈,找到下面这个帖子,似乎是跟_updateGraphics有关?

  • Creator 版本: 2.4.3

  • 目标平台:

  • 重现方式:

  • 首个报错:

  • 之前哪个版本是正常的:

  • 手机型号:

  • 手机浏览器:

  • 编辑器操作系统:

  • 重现概率:

maskNode.parnt = this.gameLayer这句写错了吧,是不是parent

很仔细,赞一个。不过这是拷过来修改的时候误删了个字母,代码里拼写是正确的,因为就像我上面说的,在把type那句注释掉之后,整个代码运行是正常的,是可以显示图片资源的。

可以提供一个demo,我按照你的方式写是没有问题的

刚我创建了一个空项目,想提供demo的时候,用这段代码也没问题了。。。然后我又回去重新试了下,之前这段我是写在现在的项目的startGameBtn的回调里面的,我换了几个地方,onload,initData这种地方都不行,后来放到游戏的后面一些的阶段里,也没问题了。我看下来,唯一的区别就是一开始几个地方的gameLayer的active都还是false状态,后来才是true,会是这个原因么?但的确没想到其他还有什么可能性。

可以把父节点换一个试试

请问你测试的是哪个平台的问题?之前有解决过类似的在原生平台上的问题。

您说的平台指的是?我现在在用chrome调试,开发工具是VS Code,Creator版本是2.4.3,还没有发布到安卓或者IOS或者微信之类的平台。

那么你的测试平台就是 web pc

这是我的测试代码,没能复现问题:

    clicked () {
        var maskNode = new cc.Node();
        var mask = maskNode.addComponent(cc.Mask);
        maskNode.parent = this.node;
        maskNode.width = 50;
        maskNode.height = 50;
        maskNode.setPosition(50,70);
        mask.type = cc.Mask.Type.ELLIPSE; //加这句就报错,不加就没事儿,就可以在mask的区域内显示下面这段代码里面加载的图片,只不过是默认的方形的mask

        var aaa = new cc.Node();
        var sprite = aaa.addComponent(cc.Sprite);
        sprite.spriteFrame = this.testFrame;
        aaa.parent = maskNode;
        aaa.setPosition(0, 0);
    }

你对比看下

谢谢,就像上面我回复给蛋定的那样,我猜测是我的gamelayer还是fasle的关系。当中还有个细节就是我有一个0.1秒的动画,在这个之后才把gamelayer置成true,就是这个导致这段test代码执行的时候gamelayer还是fasle,之前我没注意到,刚才又尝试了下,的确就是这个原因。感谢两位的帮助,谢谢。

看问题好像是这个的原因CCMask:

_createGraphics () {
        if (!this._graphics) {
            this._graphics = new Graphics();
            cc.Assembler.init(this._graphics);
            this._graphics.node = this.node;
            this._graphics.lineWidth = 0;
            this._graphics.strokeColor = cc.color(0, 0, 0, 0);
        }
    },

看错误信息是this._graphics不存在,而_createGraphics 方法是在OnEnable之后调用的。
检查下mask节点的active

相关问题的修复:
https://github.com/cocos-creator/engine/pull/7429
已经合并到 2.4.4