事件管理器是什麼:
這邊用遊戲做例子,事件管理器主要就是管理玩家可能因為遊戲機制而觸發的預設事件,假設玩家死亡這件事已經被列為一個事件在事件管理器內做管理,那當玩家死亡事件觸發後,就會把死亡事件由事件管理器去通知可能播放死亡音效、顯示死亡UI、抑或是自動調整遊戲難度等等,而我們就是利用設計模式裡的觀察者模式去進行實作,不知道觀察者模式的可以點連結回去查看 觀察者模式
而今天這篇會分享以觀察者模式架構所做的事件管理器的處理方式,後面會帶到成就系統的關係
事件管理器 程式架構 UML (例)
以上例子的實作大至分類為:
遊戲事件列舉
GameEvent {
- 玩家連擊事件
- 玩家失敗事件
- 玩家勝利事件
- 玩家Good事件
- 玩家Perfect事件
}
遊戲事件管理器類別
GameEventManager {
- 包含事件與事件主題類別的Dictinary
- 觀察者註冊事件方法(註冊者依想註冊的遊戲事件找到事件主題並對主題註冊)
- 通知方法(通知所有註冊XX事件的註冊者,XX事件發生了,並帶想傳遞的事件資料)
}
遊戲事件主題類別
IGameEventSubject {
- 遊戲事件觀察者List
- 主題註冊方法
- 取消註冊方法
- 通知方法(通知所有註冊本事件主題的註冊者本事件主題發生)
- 需要的傳遞的事件資訊設定方法
}
各種遊戲事件觀察者類別(以PerfectSubject為例)
PerfectSubject{ //繼承IGameEventSubject
- 繼承IGameEventSubject的方法
- Perfect的次數
- 目前的關卡名
- 取得目前得到Perfect的關卡名稱方法
- override 需要的傳遞的事件資訊設定方法(取得傳入的關卡名資訊並加上Perfect次數)
}
遊戲事件觀察者類別
IGameEventObserver {
- 設定主題方法
- 被通知事件之後的更新方法
}
各種遊戲事件觀察者類別(以PerfectObserverUI為例)
PerfectObserverUI{ //繼承IGameEventObserver
- 註冊的主題
- GameUI類別
- PerfectObserverUI建構子(建立時帶入GameUI類別設置)
- 實作設定主題方法
- 實作被通知事件之後的更新方法(取得註冊主題的相關資訊,並呼叫GameUI的ShowPerfect帶入主題資訊做更新)
}
透過觀察者註冊事件的類別(以GameUI為例)
GameUI
{
- 初始方法(帶入自己建立屬於自己的觀察者類別,並透過事件管理器註冊事件)
- 事件相關須更新的方法(這裡以ShowPerfect為例)
}
Code:
- 遊戲事件列舉
- 遊戲事件管理器類別
這裡的GameEventManager繼承了Singletion這裡涉及了單例模式的部分,可以參考:單例模式
- 遊戲事件主題類別
- 各種遊戲事件主題類別(以PerfectSubject為例)
- 遊戲事件觀察者類別
- 各種遊戲事件觀察者類別(以PerfectObserverUI為例)
- 透過觀察者註冊事件的類別(以GameUI為例)
當然成就系統也理所當然可以註冊事件管理器得到他想要的資訊,如同GameUI的例子,產生多個相關事件觀察者進行註冊
就像剛剛GameUI有一個專屬對Perfect事件的觀察者PerfectObserverUI
成就系統也可以有一個專屬觀察者對Perfect主題做觀測PerfectObserverAchievement,例如:
然後還可以多加入ComboObserverAchievement,GoodObserverAchievement等觀察者
最後在成就系統做初始化時,做事件系統註冊
這樣就能把事件傳入成就系統,就可以繼續往下做其他成就存檔和呈現了
其實事件管理和成就系統還可以再改善與變化,會再另外做一篇發布,但純粹用觀察者模式來實作事件管理和成就系統就差不多是這樣
留言列表