cocos内置事件问题

  • Creator 版本:所有版本都会有问题,测试的引擎版本是2.2

  • 目标平台: web

  • 详细报错信息,包含调用堆栈:

  • 重现方式:

给父节点绑定touch事件,监听
this.node.on(cc.Node.EventType.TOUCH_START, (e) => { console.log('start top') }, this, true) this.node.on(cc.Node.EventType.TOUCH_END, (e) => { console.log('end top') }, this, true)

然后创建一个同大小的子节点,同样也绑定两个这样的事件

同时添加一个定时器,定时3秒后清除界面

当界面一打开以后,手指就按在界面上面不离开,只到定时器执行清除destroy
然后松开手指,这个时候正确思路想要的时候还应该触发父节点上面的touchend事件,
当时界面直接destroy以后,手指在父节点上面离开也不会触发touchend了,

  • 之前哪个版本是正常的 :

  • 手机型号 :

  • 手机浏览器 :

  • 编辑器操作系统 :

  • 编辑器之前是否有其它报错 :

  • 出现概率:必现

  • 额外线索:

或者可以告诉一下,低版本有没有什么更好的方法解决多点触控和阻止点击穿透问题

这里是测试代码,

NewProject_1_3d_2.zip (1.5 MB)

请问测试使用的哪个浏览器?

谷歌浏览器,还有或者告诉我下怎么获取触摸的点数?

getTouches的长度为什么永远为1,我多点触摸的时候,长度是不变的,有开关?

你可以使用event.getID()来获取当前的TouchID,通过管理ID你就可以知道了

谢谢大佬

节点 destroy 之后,节点所注册的事件就会被全部取消,这个是正确的表现。

子界面的事件被取消这个可以理解,但是我父节点还在呀,我手指离开父节点的时候事件也没有了,这就不正常了吧?

嗯,我知道你的意思了,我本地发现问题了,我再看下。

这里的效果是正确的。
引用大佬的回复:

这个是正常的,事件触发时按照节点树的层级为优先级,进行 hitTest,如果节点检测成功表明点击到该节点,触发TouchStart,并停止后续节点的处理,父节点的事件触发则是通过冒泡的形式向上传递。如果节点被移除销毁,那事件也会被清空,那TouchEnd也不会再触发,同样的也不会再产生冒泡。这个用户想要这种表现的话那在Start回调的时候先隐藏节点就好了,不要直接移除销毁。
事件管理器里面触发TouchEnd事件的条件是有TouchStart的记录才可以,只有子节点触发过TouchStart,触发TouchEnd的时候子节点销毁了,父节点也没有TouchStart的记录,所以不会触发End事件。这样处理没什么问题,避免跟冒泡阶段的处理产生重复回调。

这里要怎么理解呢?
我刚也去试了一下,子节点设置为active=false,事件也是会被移除不会冒泡的!

active = false 也会出现上面的情况,可以通过 position 、opacity 、scale 等属性来隐藏节点。

那我截图这个咋理解呢?这个不是先捕获了么?