Когда нужно отменить регистрацию слушателей событий и запланированных обратных вызовов в Cocos2d-js 3.2

Я использую Cocos2d-js v3.2 для создания пользовательских подклассов cc.Sprite с помощью 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);
    }
});

1 ответ

Хорошо, когда регистрировать и отменять регистрацию события зависит от ситуации. EventManager не зависит от системы рендеринга, не беспокойтесь о побочных эффектах. Но вы должны знать, что eventListener будет действовать после его регистрации, а не когда вы добавляете узел в дерево узлов, поэтому запускайте слушателя, когда вам это нужно,

когда вы вызываете cc.eventManager.addListener, если вторым параметром является ccnode, то eventlistener будет автоматически незарегистрирован, когда этот узел будет уничтожен. если второй параметр имеет приоритет, вы должны удалить список событий вручную, когда он вам не нужен.

Другие вопросы по тегам