简单封装了一下cc.eventManager,结果。。。

var LONG_PRESS_TIMING = 1000;

var TouchableSprite = cc.Sprite.extend({

    listen: function(handlers) {
        cc.eventManager.addListener({
            event: cc.EventListener.TOUCH_ONE_BY_ONE,
            swallowTouches: true,
            onTouchBegan: function(touch, event) {
                var target = event.getCurrentTarget();
                var locationInNode = target.convertToNodeSpace(touch.getLocation());
                var size = target.getContentSize();
                if(cc.rectContainsPoint(cc.rect(0, 0, size.width, size.height), locationInNode)) {
                    if(typeof handlers.onTouch == 'function' && handlers.onTouch(touch, event) === false) {
                        return false;
                    }
                    if(typeof handlers.onLongPress == 'function') {
                        target.touchedAt = Date.now();
                    }
                    return true;
                }
                return false;
            },
            onTouchMoved: function(touch, event) {
                var target = event.getCurrentTarget();
                if(target.isMoving === false) {
                    return;
                }
                if(!target.isMoving) {
                    target.isMoving = typeof handlers.onMoveStart == 'function' ? !(handlers.onMoveStart(touch, event) === false) : true;
                }
                if(target.isMoving && typeof handlers.onMove == 'function') {
                    handlers.onMove(touch, event);
                }
            },
            onTouchEnded: function(touch, event) {
                try {
                    var target = event.getCurrentTarget();
                    if(target.isMoving === false) {
                        return;
                    }
                    if(target.isMoving && typeof handlers.onMoveEnd == 'function') {
                        handlers.onMoveEnd(touch, event);
                        return;
                    }
                    if(target.touchedAt && Date.now() - target.touchedAt >= LONG_PRESS_TIMING) {
                        handlers.onLongPress(touch, event);
                        return;
                    }
                    if(typeof handlers.onTap == 'function') {
                        handlers.onTap(touch, event);
                    }
                } finally {
                    delete target.touchedAt;
                    delete target.isMoving;
                }
            }
        }, this);
    },

    unlisten: function() {
        //Some problem here, it can not be removed actually
        cc.eventManager.removeListener(this);
    },

    onExit: function(){
        this.unlisten();
        this._super();
    }

});


```


如上,简单封装了一个支持cc.eventManager的Sprite,结果发现在调用 unlisten (即cc.eventManager.removeListener(this);) 不起作用,还能够照常响应 touch事件,跟进去看了一下也没弄明白究竟,发出来请大神指导一下。

如果是3.1版,在listen里面写this.listener = cc.eventManager.addListener(…), 在unlisten里面cc.eventManager.removeListener(this.listener);应该是可以的