1

我正在使用 Cocos2d-js v3.2 创建cc.Spriteusing的自定义子类extend()。该子类的实例是可点击的(可触摸的)并且每帧都需要一些计算。为了代码可读性,我想注册触摸侦听器并在构造函数中添加调度程序回调。这样,无论何时创建新的精灵,它都会自动准备好使用。关于这种方法,我有两个问题:

  1. 在构造函数中注册监听器是做这些事情的最佳场所吗?在将精灵添加到节点树之前调用构造函数,所以我担心是否可能存在一些我现在不知道的副作用。
  2. 我应该何时何地取消注册触摸侦听器/调度程序回调?当精灵从节点树中移除时,当它变得不可见或当对象被销毁时

代码:

var MySprite = cc.Sprite.extend({
    ctor: function () {
        this._super();

        this.initUserInput();
        this.initUpdates();
    },
    update: function (dt) {
        // Do some per-frame calculactions
    },
    initUpdates: function(){
        cc.director.getScheduler().scheduleUpdateForTarget(this, 1, !this._isRunning);
    },
    initUserInput: function(){
        var $this = this;
        var listener = cc.EventListener.create({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            onTouchBegan: function (touch, event) {
                var p = touch.getLocation();
                var rect = $this.getBoundingBox();
                if(!cc.rectContainsPoint(rect, p))
                {
                    return false;
                }
            },
            onTouchEnded: function (touch) {
            },
            onTouchMoved: function (touch) {
            }
        });
        cc.eventManager.addListener(listener, this);
    }
});
4

1 回答 1

1

好吧,何时注册和取消注册事件取决于具体情况。eventManager 独立于渲染系统,不用担心副作用。但是您应该知道 eventListener 将在您注册后生效,而不是在您将节点添加到节点树时,因此在需要时安装监听器.

当你调用cc.eventManager.addListener时,如果第二个参数是ccnode,那么当这个节点被销毁时,eventlistener会自动注销。如果第二个参数是优先级,则应该在不需要时手动删除事件监听器。

于 2015-01-21T08:54:20.083 回答