📄 state.h
字号:
// State.h: interface for the CState class.
//
// 本程序是《疯狂的火星虫—面向对象状态机实践指南》的演示程序
//
// 版权所有 (C) 2004 王咏武
// http://www.contextfree.net/wangyw/
//
/////////////////////////////////////////////////////////////////////////////
#if !defined(AFX_STATE_H__14FA61D4_5DB9_4683_9895_336EC8BF24D2__INCLUDED_)
#define AFX_STATE_H__14FA61D4_5DB9_4683_9895_336EC8BF24D2__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#ifdef ON_EVENT
#undef ON_EVENT
#endif
#ifndef NULL
#define NULL 0
#endif
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define STATE_CLASS_NAME(state_name) \
CFSM_STATE_CLASS_##state_name
#define DEFINE_STATE_CLASS(state_name) \
class STATE_CLASS_NAME(state_name) : public CState \
{ \
public: \
STATE_CLASS_NAME(state_name)(CFSM * pFSM, const char * lpName, \
const char * lpParent) : CState(pFSM, lpName, lpParent) {} \
\
bool OnEvent(CFSM * pFSM, WORD wEvent, WORD wPAram, DWORD lParam); \
};
#define INIT_ROOT_STATE(state_name) \
m_States.empty(); \
m_States.push_back(new STATE_CLASS_NAME(state_name)(this, \
#state_name, NULL));
#define INIT_STATE(parent_state, state_name) \
m_States.push_back(new STATE_CLASS_NAME(state_name)(this, #state_name, \
#parent_state));
#define BEGIN_STATE_TRANSITION(state_name) \
bool STATE_CLASS_NAME(state_name)::OnEvent(CFSM * pFSM, WORD wEvent, \
WORD wParam, DWORD lParam) \
{ \
CLASS_NAME * pClass = dynamic_cast<CLASS_NAME *>(pFSM);
#define ON_ENTRY(action_name) \
if (wEvent == EVENT_ENTRY) \
return pClass->action_name(wParam, lParam);
#define ON_EXIT(action_name) \
if (wEvent == EVENT_EXIT) \
return pClass->action_name(wParam, lParam);
#define ON_EVENT_TRANSITION(event, guard_name, action_name, target_state) \
if (wEvent == event) \
if (pClass->guard_name(wParam, lParam)) \
{ \
bool ret = pClass->action_name(wParam, lParam); \
pClass->TransitTo(#target_state); \
return ret; \
}
#define ON_EVENT_INTERNAL(event, guard_name, action_name) \
if (wEvent == event) \
if (pClass->guard_name(wParam, lParam)) \
return pClass->action_name(wParam, lParam);
#define ON_ALL_EVENT_TRANSITION(guard_name, action_name, target_state) \
if (wEvent != EVENT_ENTRY && wEvent != EVENT_EXIT) \
if (pClass->guard_name(wParam, lParam)) \
{ \
bool ret = pClass->action_name(wParam, lParam); \
pClass->TransitTo(#target_state); \
return ret; \
}
#define ON_ALL_EVENT_INTERNAL(guard_name, action_name) \
if (wEvent != EVENT_ENTRY && wEvent != EVENT_EXIT) \
if (pClass->guard_name(wParam, lParam)) \
return pClass->action_name(wParam, lParam);
#define END_STATE_TRANSITION \
return false; \
}
class CFSM;
class CState
{
protected:
// 进入和离开动作的事件ID
enum
{
EVENT_ENTRY = 0xfffe,
EVENT_EXIT
} ENUM_EVENT_PRESERVE;
public:
CState(CFSM * pFSM, const char * pName, const char * pParent);
virtual ~CState() {}
CState * GetParent() const { return m_pParent; }
bool SendEvent(CFSM * pFSM, WORD wEvent, WORD wParam, DWORD lParam);
virtual bool OnEvent(CFSM * pFSM, WORD wEvent, WORD wPAram, DWORD lParam) = 0;
void ActiveDefaultChild(CFSM * pFSM);
void Active(CFSM * pFSM, CState * pStop);
void Deactive(CFSM * pFSM);
const char * GetActiveLeaf();
bool IsActive();
const char * GetName() const { return m_pName; }
protected:
CState * m_pParent; // 父状态
CState * m_pDefault; // 缺省子状态
CState * m_pActive; // 当前的活动子状态
const char * m_pName; // 状态的名字
};
#endif // !defined(AFX_STATE_H__14FA61D4_5DB9_4683_9895_336EC8BF24D2__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -