幀同步遊戲開發框架(推倒重構版)
阿新 • • 發佈:2019-02-06
幀同步訊息、物件池、邏輯/檢視層物件、事件訊息!
1. 幀同步訊息
幀同步訊息由Msg目錄下的幾個檔案進行管理,所有Input進行的操作皆是SendMsg來開始。
2. 物件池
物件池管理比較複雜, 但是對於整個程式而言十分重要,且可以幫助理清程式的結構,一定程度上幫助實現解耦。
物件池分為兩個:LogicObjectPool和ViewObjectPool
每個物件池以字典的形式進行儲存,然後字典裡每個鍵值對是以 型別名-堆疊 的形式存在的。即例如Tank邏輯物件,鍵值對錶現為:(string "tank",Stack<LTank>)形式,每增加一種新物件時開一個新的堆疊進行儲存。
物件池中的堆疊儲存的是LogicObject的基類。當存在已有物件時,可以返回物件,若不存在,則需要根據String呼叫生成函式生成對應的Object。
....
至於已有物件怎麼修改值使得其值屬於新生成物件的屬性,待討論。
3. 邏輯/檢視層物件
邏輯/檢視層物件,在此前已有所涉及,但程式碼結構略亂,思路駁雜。在此進行大規模的重構。
重構的基礎核心思想:生成兩個基類:LogicObject和ViewObject基類,這兩個類主要實現所有邏輯和檢視物件的基本元素,例如LogicObject的移動速度,質量,以及我們會需要用到的其他共有元素等。ViewObject中包括LogicObject,繫結函式,等等。
4. Event事件機制
在邏輯層與檢視層之間,可以採用Event事件機制來進行通訊。簡單來說,就是像Msg那樣的傳送和處理訊息的方法。不過該方法已經封裝好了,只需要正確使用即可。用於程式內部的通訊,最重要的是可以大大的優化Logic和View之間的通訊結構,而且對於解耦很有幫助。
//全域性事件 public static EventDispatcher GlobalEventDispatcher = new EventDispatcher(); //坦克開火 dispatcher.SendEvent(EventType.TANK_SHOOT, null); //坦克轉向 //冷卻的時候也瞄準,通知view層朝向 dispatcher.SendEvent(EventType.TANK_AIM, dir); //然後在對應的View檢視處理 LTank.dispatcher.AddEventHandler(EventType.TANK_AIM, OnLogicAim); LTank.dispatcher.AddEventHandler (EventType.TANK_SHOOT, OnLogicShoot); LTank.dispatcher.AddEventHandler(EventType.TANK_UPGRATE, OnUpgrate); //我們將dispatcher變數在Logic基類中宣告,方便使用 //然後在View中定義相關處理即可
5. Manager Input Else
剩下的則是各種管理類和輸入處理類,以及其他的如攝像機跟隨和適配之類的處理類。