Cocos2d-X的事件分發(1)

課程概述

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

事件系統,從小處說它是應用程序內部各個模塊交互的設計模式,從大處說它是軟件架構的組成模塊。Cocos2d-X 3.x之後,事件分發不僅分發系統事件,還可以分發開發者自定義事件,而且處理順序的優先級可以根據元素的繪製順序,大大提高了觸摸等事件的管理效率。

課程筆記

事件的機制

大多數事件系統是訂閱者設計模式。

事件是用於處理模塊之間通信的模型。比如模塊A觸發某個事件的時候,調用模塊B的方法。如果模塊A直接調用B的方法,那麼需要在模塊A對B進行實例化,那麼如果B發生變化,A可能也需要發生變化。而且有可能B和A是完全獨立的系統,或者A無法提前知道B的情況,甚至可能開始的時候並沒有B的存在。

那麼訂閱者模塊就是將事件的觸發者和響應者分開。流程是,模塊B向事件分發器註冊了一個訂閱者listenb,表明自己需要處理類型typeA的事件消息,listenb帶一個處理事件的回調方法地址func;模塊A在事件發生的時候向事件分發器發出類型typeA的事件消息通知,並傳入參數args;事件分發器接到消息後,從訂閱者列表找到訂閱者listenb,並相應該事件觸發listenb的回調函數func,並傳入args。

這樣,事件可以不依賴響應者的實現,而預先定義,事件響應者甚至可以動態的修改刪除。甚至一個事件類型沒有任何訂閱者都沒有關係,該事件將什麼都不發生。

事件系統有許多優點:1、減少軟件內模塊之間的內聚,且保持模塊之間的高效通信;2、使得系統可以提前預定義一些事件(比如觸摸、加速計等系統事件);3、解除了模塊之間的耦合,使得模塊之間更加獨立;4、一個事件可以對應多個訂閱者(多個訂閱者都是訂閱一個類型的事件),多個訂閱者可以對應一個事件源(多個不同類型的訂閱者,一個事件源可能引起多個類型的事件,比如物理碰撞發生時,物理引擎需要計算碰撞後的位置,AI系統需要做數值計算,動畫特效系統可能播放一些動畫特效。)

事件系統也有限制:1、事件系統影響系統,因爲在搜索訂閱者的時候需要排序查詢,比如AI算法在每幀需要實時更新多個角色的遊戲狀態,不適合用事件分發。2、訂閱者雖然有回調函數,但是永遠不如直接調用好用。

事件的訂閱者

訂閱者是EventListener的子類,比如EventListenerTouchOneByOne是用來相應觸摸事件的。每個EventListener由一個或者多個回調函數、一個訂閱者Type、一個listenerID組成,Type是用來區分EventListener的,listenerID與Type一一對應(除了Type爲CUSTOM的時候,listenerID數量無限);listenerID又與事件的Type 對應,事件分發器得到事件Type的時候,也就得到listenerID,進而找到事件訂閱者。事件包含事件類型和參數,類型與listenerID一一對應(觸摸事件對應2個事件訂閱器EventListenerTouchOneByOne和EventListenerTouchAllAtOnce,CUSTOM事件的參數eventName爲listenerID。)

註冊訂閱者,通過addEventListenerWithSceneGraphPriority和addEventListenerWithFixedPriority。addEventListenerWithSceneGraphPriority第二個參數爲Node,優先級爲0,順序按照node繪製順序的反序;addEventListenerWithFixedPriority第二個參數爲int,不能設置爲0,數字越小優先級越高。無法判斷訂閱者的關聯的node,當優先級通過第二個函數設置時,可以通過setPriority修改優先級。

刪除訂閱者,通過removeEventListener、removeCustomEventListeners、removeAllEventListeners、removeEventListenersForTarget、removeEventListenersForType。注意所有的EventCustomListener的Type都是CUSTOM。

修改訂閱者,調用Node的onExit的時候會暫停訂閱者pauseEventListenersForTarget,調用OnEnter會恢復訂閱者resumeEventListenersForTarget。修改非Node的訂閱者需要調用訂閱者的setEnabled方法。


原文地址:

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


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