关于typescript:CocoscreatorTS-ccNode监听自身被添加移除

cc.Node无论是被增加、被移除,都会调用它的 setParent,咱们来看看源码:

  • 被增加:

  • 被移除:

被移除代码中的 child.parent 所调用的,其实就是 child.setParent ,它是在 _BaseNode (cc.Node的基类)的原型中定义的,咱们来看看:

这意味着,咱们单单重写 setParent 办法的话,只能解决被增加的状况,对被移除无能为力。
那咱们只有想方法替换掉这个 parent setter 就能达到目标了。

办法是间接给cc.Node的原型定义一个属性:

Object.defineProperty(cc.Node.prototype, "parent", {
    // getter也要定义,不然会报错,还是间接调用getParent
    get: function() { return this.getParent(); }, 
    set: function(v) { /** your code */ },
});

但在理论场景中,咱们并不需要给所有的cc.Node增加监听,只须要给那些关注被增加/移除操作的对象增加即可:

/** 自定义节点*/
class CustomNode extends cc.Node {
    // 定义本人的解决办法。当然,持续应用setParent作为办法名也能够
    mySetParent(v: cc.Node) {
        // 肯定要调用父类的setParent
        super.setParent(v);
        /** your code */
    }
}

// 给自定义节点定义属性
Object.defineProperty(CustomNode.prototype, "parent", {
    get: function() { return this.getParent(); },
    set: function(v) { this.mySetParent(v) },
});

功败垂成!

【腾讯云】轻量 2核2G4M,首年65元

阿里云限时活动-云数据库 RDS MySQL  1核2G配置 1.88/月 速抢

本文由乐趣区整理发布,转载请注明出处,谢谢。

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据