1. 程式人生 > >幀同步遊戲開發框架(推倒重構版)

幀同步遊戲開發框架(推倒重構版)

幀同步訊息、物件池、邏輯/檢視層物件、事件訊息!

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

剩下的則是各種管理類和輸入處理類,以及其他的如攝像機跟隨和適配之類的處理類。