實現狀態機框架,可以繼承此框架的基類實現自定義功能,需要quickhash標頭檔案,原始碼如下,請尊重原創!歡迎批評指正!
fsm.h
#ifndef fsm_h
#define fsm_h
#include #include "quickhash.h"
#include "fsmstate.h"
#include "typetag.h"
/**@file fsm.h
* 實現狀態機
* @author xiaoxing.zhou
* @date 2012.4.27
* @version v1.0
*/class eventbase;
class fsm
/**啟動狀態機*/
bool startrun();
/**停止狀態機*/
bool stoprun();
/**處理event*/
void process(eventbase* pevent);
/**預設執行方法*/
virtual bool default();
void transitstate(typetag* ptag);
/**事件與狀態註冊方法*/
static void registerevent(const char* pname, int id);
static void registerstate(const char* pname, int id);
static typetag* retrivestate(const char* pname);
static typetag* retriveevent(const char* pname);
protected:
/**查詢狀態*/
fsmstate* findstate(typetag* ptag);
private:
//!儲存state和event標識
typedef quickhashhashtable;
static hashtable m_statetag;
static hashtable m_eventtag;
typedef typetag eventtag;
typedef typetag statetag;
fsmstate* m_pstate;
fsmstate* m_pexitstate;
std::vectorm_statevect;
};#endif
fsm.cpp
#include "fsm.h"
#include "eventbase.h"
fsm::hashtable fsm::m_statetag;
fsm::hashtable fsm::m_eventtag;
fsm::fsm()
fsm::~fsm()
bool fsm::setexit(const char* pname)
bool fsm::addstate(fsmstate* pstate)
bool fsm::startrun()
return false;
}bool fsm::stoprun()
return false;
}void fsm::process(eventbase* pevent)
else
}else
} else }}
bool fsm::default()
void fsm::transitstate(typetag* ptag) }}
void fsm::registerevent(const char* pname, int id)
void fsm::registerstate(const char* pname, int id)
typetag* fsm::retrivestate(const char* pname)
typetag* fsm::retriveevent(const char* pname)
fsmstate* fsm::findstate(typetag* ptag)
} return null;
}
fsmstate.h
#ifndef fsm_state_h
#define fsm_state_h
#include #include "typetag.h"
/**@file fsmstate.h
* 定義狀態機狀態基類.
* @author xiaoxing.zhou
* @date 2012.4.27
* @version v1.0
*//**@class eventbase
* 宣告事件基類.
*/class eventbase;
class fsmstate;
/**狀態進入執行方法*/
virtual void enter();
/**狀態離開執行方法*/
virtual void exit();
/**未定義事件發生執行方法*/
virtual bool default();
/**新增狀態允許發生事件列表*/
void addevent(const char* pname);
/**匹配函式*/
bool match(typetag* ptag)
/**判斷是否允許事件*/
bool findevent(typetag* ptag);
private:
typetag* m_ptag;
std::vectorm_eventvect;//!< 事件列表
};#endif
fsmstate.cpp
#include "fsmstate.h"
#include "fsm.h"
#include "eventbase.h"
fsmstate::fsmstate(const char* pname)
void fsmstate::addevent(const char* pname)
bool fsmstate::findevent(typetag* ptag)
virtual ~eventbase(){};
/**事件發生時候執行的操作*/
/**匹配函式*/
bool match(typetag* ptag)
/**獲取事件標識*/
typetag* gettag()
/**獲取轉移狀態標識*/
typetag* getnextstate()
private:
typetag* m_peventtag;
typetag* m_pstatetag;
};#endif
typetag.h
#ifndef type_tag_h
#define type_tag_h
#include /**@file typetag.h
* 定義標識類,用於標識event和state.
* @author xiaoxing.zhou
* @date 2012.4.27
* @version v1.0
*/class typetag
/**獲取id*/
int getid()
/**獲取名稱*/
const char* getname()
/**匹配函式*/
bool match(int id)
bool match(const char* pname)
private:
int m_id;
std::string m_name;
};#endif
簡單測試**main.cpp
#include "fsm.h"
#include "eventbase.h"
int main(void)
kanzi狀態機實現
1.在library中選中state managers建立create state manager。2.在library中選中property types建立create property type,name state category custom datatype interger。3.修改s...
C語言實現狀態機
狀態機有4個要素 舉例 state1是現態,state2是次態,event是條件,action是動作。當產生event時,觸發action,action執行完畢後從state1遷移到state2,此時,state2為現態。在這個例子中,action只是乙個瞬時執行的動作,它只在現態遷移到次態的過程中...
C 遊戲 極品蜜蜂V1 0
閒著無聊,開發第二個遊戲,懷戀小時候在遊戲機上玩的那種什麼飛機。遊戲介面 本來是想做成飛機的,無奈沒有找到飛機,於是用乙隻蜜蜂代替。本遊戲屬於碰撞類遊戲,主要用到了aabb類。遊戲中的物體都是該類派生的子類。aabb類描述如下 using system using system.collection...