分層有限狀態機的C++實現

爲了方便我的遊戲開發,寫了這麼一個通用的分層有限狀態機。希望在其穩定以後,可以作爲一個組件加入到我的遊戲引擎當中。

目前使用了std::function來調用回調函數,在未來可能會用委託機制代替。

第一版僅僅是爲了快速開發出來使用,在未來會對性能和易用性改進。


代碼下載:http://download.csdn.net/detail/vvsxr/8060377


使用方法:

HFSM fsm;
fsm.addState(1);
fsm.addState(2);
fsm.addState(3);
fsm.addEvent(1, 1, 2);
fsm.addEvent(2, 2, 3, HFSM::PUSH);
fsm.addEvent(3, 3, 2, HFSM::POP);
fsm.setAfterEventCallBack(1, [](const HFSM::EventParameters &params){printf("event %d happened\n", params.event); });
fsm.setAfterEventCallBack(2, [](const HFSM::EventParameters &params){printf("event %d happened\n", params.event); });
fsm.setAfterEventCallBack(3, [](const HFSM::EventParameters &params){printf("event %d happened\n", params.event); });
fsm.setEnterStateCallBack(1, [](const HFSM::EventParameters &params){printf("enter state %d\n", params.to); });
fsm.setEnterStateCallBack(2, [](const HFSM::EventParameters &params){printf("enter state %d\n", params.to); });
fsm.setEnterStateCallBack(3, [](const HFSM::EventParameters &params){printf("enter state %d\n", params.to); });
fsm.setInit(1);
fsm.setFinish(2);
fsm.startup();
fsm.doEvent(1);
fsm.doEvent(2, HFSM::PUSH);
HFSM::EventParameters params;
fsm.doEvent(3, params, HFSM::SET);

流程就是1.創建狀態機,2.加入狀態,3.加入事件,4.加入回調函數,5.設置啓動狀態,6.啓動狀態機

注意:

1.不能加入狀態STATE_NULL,是在hfsm.h裏定義的,表示“無”狀態。

2.不能加入事件EVENT_STARTUP,是在hfsm.h裏定義的,表示狀態機的“啓動”事件。這兩個常量被定義爲不常用的數,你可以自己修改,現在它們的值爲-9999999

3.addEvent有4個參數,分別爲:事件ID,出發狀態ID,到達狀態ID,狀態遷移類型。狀態必須是已存在的狀態,也就是說,最好先把所有狀態都加入,再加入事件。狀態遷移類型表示事件發生,新的狀態是入棧還是直接代替原來的狀態,有四個值:DEFAULT, SET, PUSH, POP,其中DEFAULT表示默認,在這裏相當於SET。

4.set......CallBack 是設置事件發生前後,狀態進出時調用的回調函數,第一個參數是ID,第二個參數是std:;function型的。這幾個函數未來可能會改變,以支持委託機制。

5.setInit  setFinish 是設置狀態機的初始狀態和最終狀態

6.狀態機必須調用startup() 函數纔會啓動,從“無”狀態進入初始狀態。

7.doEvent() 事件有三個參數,第一個是事件ID,第二個是事件參數,可以不寫,如果需要給事件的發生附加參數,可以繼承HFSM::EventParameters 類,然後再創建個實例作爲參數。第三個參數表示狀態遷移類型,解釋見注意3,該參數如果不寫,或設爲DEFAULT,會使用定義這個事件時設置的遷移類型。

發佈了46 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章