http://code.google.com/p/hexabots/
分成遊戲主程式部份(play.py),與遊戲關卡製作部分(edit.py)。這裡僅分析遊戲主程式部分的有限狀態機,關於panda3D的有限狀態機介紹可以參考
http://www.panda3d.org/wiki/index.php/Finite_State_Machines
PlayState是有限狀態機類別,其中含有五個狀態:
- AwaitLoad:等待地圖載入階段
- Charge:遊戲流程判斷
- Team1:Team1行動階段
- Team2:Team2行動階段
- PlayAnim:動畫執行階段
程式啟動後,由 app.state.request('AwaitLoad') 將 FSM 從 'Off' 狀態切至 'AwaitLoad' ,並註冊 Load 函數等待地圖載入。地圖載入後經由 Load 函數中的 state.request('Charge') 將狀態切至 'charge' 。
在 charge 函數呼叫 app.state.request('Team1', character) 或 app.state.request('Team2', character) ,由於 'charge' 狀態定義了 'filterCharge' 函數,使得在 'charge' 狀態下執行 request 函數都會先經過 filterCharge 函數來決定下一個轉移的狀態。 filterCharge 經由判斷是否有動畫需要執行來決定要轉移至 'PlayAnim' 狀態執行動畫,或是轉移至 'Team1' 或 'Team2' 。 'Team1' , 'Team2' 或 'PlayAnim' 狀態執行結束後會經由 request 函數轉移至 charge 狀態。
分析:
- 執行狀態轉移的'request'函數並不完全在某個函數或類別中, 而是散佈在許多函數裡。這樣做不太容易掌握狀態轉移的過程,應該把所有 request 函數集中在一起。
- 'Charge'與'Team1','Team2'及'PlayAnim'可視為'遊戲中'狀態。'AwaitLoad'可視為進入遊戲前的'選單'狀態。 可以將原先一個有限狀態機拆成兩個,一個負責'主要流程控制',另一個負責'遊戲內的狀態控制'。
遊戲內的狀態控制舉例如下:
當主要流程控制以 NewGame 或 LoadGame 進入遊戲時,遊戲內的流程控制會先切至 'Launch' 狀態來載入遊戲內容。接著開始遊戲執行迴圈:先等待遊戲命令輸入,取得輸入後執行遊戲命令,動畫執行也在此階段依序執行。至此一個迴圈結束,如果有表單命令可在此執行,儲存遊戲或是回到主選單等等。
沒有留言:
張貼留言