觸摸事件的吞沒
當給一個 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觸摸事件響應鏈.png
圖中紅色數組和箭頭顯示了觸摸事件的傳遞順序。