Cocos2d-X的事件分發(2)

課程概述

“Cocos2d-X的事件分發(2)”課程概述

訂閱者被成功註冊到事件分發器後,事件分發器需要根據相應到的事件進行分發,本節課將重點講述如何進行事件分發。

課程筆記

事件的觸發

事件的觸發通過函數dispatchEvent或者dispatchCustomEvent來觸發。dispatchCustomEvent會自動創建一個CustomEvent;也可以先創建一個CustomEvent的event,然後通過dispatchEvent的方法來觸發。

事件的分發

在dispatchEvent的函數中,主要是實現了listenerID對應訂閱者的排序,按照順序調用訂閱者的回調函數,最後再將狀態更新。

在對listenerID對應訂閱者排序的時候,先將優先級list從小到大排列,並找到第一個優先級大於0的訂閱者索引,然後將Node對應的訂閱者list按照繪製順序進行排序。並且如果經常排序會導致性能問題,EventDispather採用做標記的辦法,在變動做標記的listenerID的時候,就會重新排序,否則就不進行重新排序。在如下函數中會做標記:setLocalZOrder、setGlobalZOrder、setPriority、forceAddEventListener、removeEventListener。如果關聯Node或者關聯Node的父類Node發生Z變換,就會需要重新排序。

事件允許嵌套,即事件的回調函數中dispatchEvent另外一個事件。在函數中通過DispatchGuard guard(_inDispatch);標記,_inDispatch初始爲0,dispatch的時候+1,生命週期結束的時候-1。需要注意的是:嵌套事件中不能執行一個相同的事件,否則會導致死循環。

在事件分發的過程中,優先級高的訂閱者可以通過event的stopPropagation選擇讓事件停止傳播

訂閱者的修改

在事件分發的過程中修改訂閱者的優先級,會在下一次觸發事件的時候生效,而通過setEnable、setPause、setRegistered會即時生效。

在事件分發的過程中,訂閱者的刪除,只是將其標記爲setRegistered(false),而在分發結束的時候移除。

在事件分發的過程中,訂閱者的添加,只是加入臨時數組_toAddedListeners,在所有事件分發結束後將其加入訂閱者list。

事件與Node

調用Node的onExit的時候會調用Node及其子Node的pause函數,在pause函數中,會調用pauseEventListenersForTarget方法,調用OnEnter會調用Node及其子Node的resume函數,在resume函數中,會調用resumeEventListenersForTarget方法。

刪除Node會自動移除和Node相關的訂閱者。


原文地址:

http://www.geekfaner.com/cocos2d-x/ReadCocos2dxSourceCode23.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章