2.4.6 引擎 touch bug

之前用 2.4.4 , touch 会出现接收不到 TOUCH_END 事件的问题,
然后看 2.4.6 有一条引擎修复
修复事件回调中触发其他事件导致事件丢失的问题[[#8276]](https://github.com/cocos- creator/engine/pull/8276)
然后升级到 2.4.6 之后依然会出现这个问题

在论坛内搜到之前的一个 帖子 cc.Node.EventType.TOUCH_END有时候监听不到
根据这条回复


尝试修改节点结构
修改前image修改后 image
问题依然存在

附上 demo 和 操作视频, demo 为修改前的节点结构,论坛无法上传视频,所有打成了压缩包
CCCTouchTest.zip (238.8 KB)
VID_20210828_120500(0).zip (3.4 MB)


如图,判断里多加个条件;(!listener._isPaused())
文件路径:cocos2d\core\event-manager\CCEventManager.js
试试?
CCEventManager.zip (9.0 KB)

还是不行
因为不想改引擎,所以在项目下新建了一个 js 脚本 重写了下

let eventManager = cc.internal.eventManager;
cc.internal.eventManager._onTouchEventCallback = function (listener, argsObj) {
...
...
}

这样应该是没毛病,测试之后问题还是没解决

我现在在 UI 层添加了一个 全屏的触摸层,对触摸层进行多点触摸的监听,遍历所有触摸点,判断是否点击到了某按钮,暂时性的解决了这个问题


    onTouchBegan(event: cc.Event.EventTouch) {
        let touches = event.getTouches();
        for (let i = 0; i < touches.length; i++) {
            const touch = touches[i];
            if(this.isTouched(this.leftBtnPanel,touch) && this.icoLeft.active){
            }else if(this.isTouched(this.rightBtnPanel,touch) && this.icoRight.active){
            }else if(this.isTouched(this.btnJump,touch)){
            }else if(this.isTouched(this.btnSkill,touch)){
            }
        }
    }

    onTouchMoved(event: cc.Event.EventTouch) {
        let touches = event.getTouches();
        for (let i = 0; i < touches.length; i++) {
            const touch = touches[i];
            if(this.isTouched(this.leftBtnPanel,touch) && this.icoLeft.active){
            }else if(this.isTouched(this.rightBtnPanel,touch) && this.icoRight.active){
            }
        }
    }
    onTouchEnded(event: cc.Event.EventTouch) {
        this.onTouchCancel(event);
    }
    onTouchCancel(event: cc.Event.EventTouch) {
        let touches = event.getTouches();
        for (let i = 0; i < touches.length; i++) {
            const touch = touches[i];
            if(this.isTouched(this.leftBtnPanel,touch) && this.icoLeft.active){
            }else if(this.isTouched(this.rightBtnPanel,touch) && this.icoRight.active){
            }else if(this.isTouched(this.btnJump,touch)){
            }else if(this.isTouched(this.btnSkill,touch)){
            }
        }
    }

我这边测试是能回弹,不会像视频里的那样。

你把你改的那个还原。然后这个直接放到项目目录下试试
CCEventManager.zip (9.5 KB)

测试的时候按住 右键,频繁的点击 跳跃和攻击键,持续个 10几秒试试

额,测试时间没那么久。复现了。

你再试试改引擎的那种方式,按理说应该都会出现

挖个坟答复一下这个问题

3.4.0 里应该解决了这个问题了已经,
旧版本可以试着提高一下 macro.TOUCH_TIMEOUT 的时间