关闭事件监听的代码写不好

感觉上好像不难,但跟着文档写了总是不管用,然后没有查到特别直接的案例,只好在这里发问了。

我要实现的逻辑如下:先生成一个预制,比如飞刀,用手移到需要发射的位置后松开手,飞刀飞出去,同时下一个飞刀的预制生成,等待手指去移动。

我的做法是计划在每个预制生成的时候,注册一个事件监听,然后松手飞出去的时候关闭监听,因为飞出去就不可以操控它了。

现在就是怎么都关不掉,看文档说关闭要和注册写的一毛一样,我就一毛一样的写了,还是不行。有哪位大佬能有样例代码给参照一下么?

我写的注册的就类似这样
this.node.on(cc.Node.EventType.TOUCH_START, function(e){
var touchLoc = e.getLocation();
this.selectStartPosition(touchLoc);
}, this);
关闭的就类似这样
this.node.off(cc.Node.EventType.TOUCH_START, function(e){
var touchLoc = e.getLocation();
this.selectStartPosition(touchLoc);
}, this);
关闭是写在注册的触摸结束的事件里的,就是这个releaseObject()方法里面
this.node.on(cc.Node.EventType.TOUCH_END, function(e){
this.releaseObject();
}, this);

  • Creator 版本:2.4.3

可能就是你off中的callback的问题,off时会判断callback和on时的callback是不是同一个callback。

你也可以用targetOff直接解绑所有事件。

大佬能简单写个样例么,只是有思路我现在的水平还不知道怎么执行。。

研究出来了,暂时用targetOff搞定的,以后再研究怎么定向解除吧,谢谢大佬指点。

这样写的话,在注册和关闭的时候,回调其实是两个对象。在关闭的时候,判断回调是否相同,肯定就不相同了。

cocos为啥在注销时传递之前的函数就可以取消,是因为在注册时引擎给这个函数增加了一个_id属性,它是通过这个ID进行的查找并进行注销逻辑,为啥你写的就不行,因为飞刀是实例化出来的,也就是创建出来的,是新的,你传最一开始的函数当然不行了,又不是实例化被注册的那个函数

off 能关掉的必须是具名函数。
this.node.on(cc.Node.EventType.TOUCH_START, this.aaa , this);
this.node.off(cc.Node.EventType.TOUCH_START, this.aaa , this);

aaa (e){
var touchLoc = e.getLocation();
this.selectStartPosition(touchLoc);
}

大佬这个说的通透

该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。