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
谢谢大佬,谢谢