Cocos2D-JS 中触摸事件的吞没和向“下”传递

触摸事件的吞没

当给一个 Node 对象加入一个触摸 EventListener 时,要想让这个 Node 吞没这个事件,不再向“下”传递,要设置两个地方。
第一,要设置

swallowTouches = true;

第二,要在触摸事件的 onTouchBegan 回调中返回 true :

onTouchBegan : function(touch, event){
   //function body
    return true;
}

如果没有这两个设置,这个 Node 就不会吞没这个触摸事件,尤其是第二个,容易被忽略。

触摸事件的向下传递

网上的资料在介绍 Cocos2D 触摸事件的吞没时,都说不再向“下”传递,那这个“下”究竟是怎么样的顺序呢?也就是说一个 Node 的对象,在触摸事件的传递中,它的“下”是谁?

Cocos2D 在传递触摸事件时有一个类似于“传递链”之类的东西。我们假设所有的 Node 都可以响应触摸事件并且不吞没。那么当一个 Node 收到触摸事件调用了自己的回调之后,要把这个触摸事件传递给位于这个“传递链”的下一个 Node 中,这个传递顺序是和响应的优先级以及 Node 之间的父子关系有关的。

我们在给一个 Node 加入一个触摸响应的时候一般会使用一个优先级参数:

cc.eventManager.addListener(listener, nodeOrPriority);

而大多数时候,都使用 Node 的现实优先级来设置这个响应的优先级。位于同一个 Node 下的子 Node ,优先级最高的首先收到触摸事件,然后,它将这个触摸事件传递给优先级比自己小的 Node 中优先级最大的那个,依此类推,当传递链中没有兄弟 Node 后,这个事件便传递给了它们的父级 Node ,依此类推……

下面是一个此传递链的图,看图比较直观:

Cocos2D-JS 中触摸事件的吞没和向“下”传递_第1张图片
Cocos2d触摸事件响应链.png

图中红色数组和箭头显示了触摸事件的传递顺序。

你可能感兴趣的:(Cocos2D-JS 中触摸事件的吞没和向“下”传递)