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);应该是可以的