关闭多点触摸,触摸事件不会向下传递,这是bug还是故意为之

demo代码

别沉~~~

日!!!

你这是关闭吞噬触摸,不是多点触摸吧

关闭多点触摸后 关闭了吞噬 下面也收不到触摸事件

这个bug一直都在,以前就有了

【引擎问题】关于多点触控是否阻止单点时事件传递的问题
可以看下我发的这个贴子,然后改
if (!node || node.activeInHierarchy)
改成
if (!node || !node.activeInHierarchy)
就可以
但是不知道这样改是不是对的,引擎组也没回复

看了下引擎的代码 就像楼上说的 在多点触摸的时候只是判断了之前是否已经有触摸目标了 如果有了就直接返回false 没考虑传递的问题 所以这两个就冲突了 经过尝试发现 当传递的时候touchID其实是没有变化的 所以修改了下代码 将判断多加了一步 event.touch.getID() != eventManager._currentTouch._id 去判断当前的id和已经按下的是否是同一个 是的话就不返回 继续传递 完整代码是:

let eventManager = cc['internal'].eventManager;

cc['internal'].eventManager['_onTouchEventCallback'] = function (listener, argsObj) {
    // Skip if the listener was removed.
    if (!listener._isRegistered())
        return false;

    var event = argsObj.event, selTouch = event.currentTouch;
    event.currentTarget = listener._node;

    var isClaimed = false, removedIdx;
    var getCode = event.getEventCode(), EventTouch = cc.Event.EventTouch;
    if (getCode === EventTouch['BEGAN']) {
        if (!cc.macro.ENABLE_MULTI_TOUCH && eventManager._currentTouch) {
            let node = eventManager._currentTouchListener._node;
            if (node && node.activeInHierarchy && event.touch.getID() != eventManager._currentTouch._id) {
                return false;
            }
        }

        if (listener.onTouchBegan) {
            isClaimed = listener.onTouchBegan(selTouch, event);
            if (isClaimed && listener._registered) {
                listener._claimedTouches.push(selTouch);
                eventManager._currentTouchListener = listener;
                eventManager._currentTouch = selTouch;
            }
        }
    } else if (listener._claimedTouches.length > 0
        && ((removedIdx = listener._claimedTouches.indexOf(selTouch)) !== -1)) {
        isClaimed = true;

        if (!cc.macro.ENABLE_MULTI_TOUCH && eventManager._currentTouch && eventManager._currentTouch !== selTouch) {
            return false;
        }

        if (getCode === EventTouch['MOVED'] && listener.onTouchMoved) {
            listener.onTouchMoved(selTouch, event);
        } else if (getCode === EventTouch['ENDED']) {
            if (listener.onTouchEnded)
                listener.onTouchEnded(selTouch, event);
            if (listener._registered)
                listener._claimedTouches.splice(removedIdx, 1);
            eventManager._clearCurTouch();
        } else if (getCode === EventTouch['CANCELED']) {
            if (listener.onTouchCancelled)
                listener.onTouchCancelled(selTouch, event);
            if (listener._registered)
                listener._claimedTouches.splice(removedIdx, 1);
            eventManager._clearCurTouch();
        }
    }

    // If the event was stopped, return directly.
    if (event.isStopped()) {
        eventManager._updateTouchListeners(event);
        return true;
    }

    if (isClaimed && listener.swallowTouches) {
        if (argsObj.needsMutableSet)
            argsObj.touches.splice(selTouch, 1);
        return true;
    }
    return false;
}

这样修改完就可以既屏蔽多点触摸 又能传递了 我用的引擎是2.4.4 随便弄了个demo试了下可以 具体别的情况没有试过 不清楚这样修改是否是对的 楼主可以在实际环境下多试试 还有就是楼上的改法可以传递 但是同时多点触摸屏蔽也失效了 是不对的

5赞

666··

检查下是否影响blockinputEvent组件,父节点有blockinputEvent组件的时候会失效
cocos版本2.3.3

这段代码在哪个文件上看得到,大佬

CCEventManager.js的_onTouchEventCallback

谢谢大佬,谢谢