課程概述
“Cocos2d-X的事件分發(3)”課程概述
本節課將講述事件分發中比較複雜的觸摸事件與自定義事件,以及其他的一些事件分發相關的知識。
課程筆記
觸摸事件
觸摸事件是手持設備最複雜最重要的事件,首先需要區分多個觸摸點,其次每個觸摸點的事件需要通過多次分發以表示開始、移動、結束、取消等狀態。
cocos2d-X使用EventTouch來表示一個觸摸事件,每個EventTouch記錄了當前屏幕上處於相同狀態(用EventCode表示)的一組觸摸點的集合,由於一個觸摸點在不同狀態會觸發多次事件分發,每個觸摸點包含一個唯一的ID,通過Touch的getID獲取。
Cocos2d-X將觸摸事件對應的是訂閱者分爲兩種,一種是EventListenerTouchAllAtOnce,表示一個多點觸摸事件的訂閱者,含有4個回調函數,每個狀態的回調函數都包含當前所有處於該狀態的觸摸點,需要用觸摸點的ID來區分每個觸摸點。另外一種是EventListenerTouchOneByOne,將多個觸摸點分爲多個事件通知,也含有4個回調函數,其中onTouchBegan必須實現,否則接收不到事件通知。如果返回false,則其他回調函數無法相應,反之亦然。如果屏幕上同時有4個觸摸點,則相當於調用了4次EventListenerTouchOneByOne,如果不希望這樣,可以類似menu那樣做一些判斷機制。如果希望阻止觸摸點向後面訂閱者繼續分發,可以在onTouchBegan返回true的情況下,調用setSwallowTouches(true)。
在eventDispatcher內部,先觸發EventListenerTouchOneByOne,然後再觸發EventListenerTouchAllAtOnce。可以通過onTouchBegan和setSwallowTouches來控制觸發的訂閱器。如果使用stopPropagation,只會停止一個事件(一個狀態)。
觸摸點的位置判斷,touch事件傳入類型爲Touch的參數,包含getLocation、getPreviousLocation、getStartLocation、getDelta、getLocationInView、getPreviousLocationInView、getStartLocationInView函數。
元素不可見依然可以接收到觸摸事件,需要在onTouchBegan的時候檢查元素(以及長輩元素)的可見性。
其他系統事件
EventMouse處理鼠標。
EventAcclereation處理重力加速度。
EventKeyBoard處理鍵盤。
EventFocus處理焦點事件。
原文地址:
http://www.geekfaner.com/cocos2d-x/ReadCocos2dxSourceCode24.html