📄 state.cpp
字号:
// State.cpp: implementation of the CState class.
//
// 本程序是《疯狂的火星虫—面向对象状态机实践指南》的演示程序
//
// 版权所有 (C) 2004 王咏武
// http://www.contextfree.net/wangyw/
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "State.h"
#include "FSM.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CState::CState(CFSM * pFSM, const char * lpName, const char * lpParent)
: m_pDefault(NULL), m_pActive(NULL), m_pName(lpName)
{
if (lpParent)
m_pParent = pFSM->GetState(lpParent);
else
m_pParent = NULL;
// 第一个加入的为缺省状态
if (m_pParent && ! m_pParent->m_pDefault)
m_pParent->m_pDefault = this;
}
/* 从根状态开始,把事件传递给当前所有的活动状态
*
*/
bool CState::SendEvent(CFSM * pFSM, WORD wEvent, WORD wParam, DWORD lParam)
{
OnEvent(pFSM, wEvent, wParam, lParam);
if (m_pActive)
return m_pActive->SendEvent(pFSM, wEvent, wParam, lParam);
else
return false;
}
/* 从目的状态开始,激活目的状态到叶子状态之间的所有缺省子状态
* 调用这些状态的入口动作,顺序从目的状态到叶子状态,不包括目的状态
*/
void CState::ActiveDefaultChild(CFSM * pFSM)
{
if (m_pDefault)
{
// 调用缺省子状态的入口动作
m_pDefault->OnEvent(pFSM, EVENT_ENTRY, 0, 0);
// 激活缺省子状态
m_pDefault->ActiveDefaultChild(pFSM);
m_pActive = m_pDefault;
}
}
/* 从目的状态开始,激活目的状态到根状态之间的所有状态
* 调用这些状态的入口动作,顺序从根状态到目的状态
*/
void CState::Active(CFSM * pFSM, CState * pStop)
{
if (this != pStop && m_pParent)
{
// 激活父状态
m_pParent->Active(pFSM, pStop);
m_pParent->m_pActive = this;
}
// 调用自己的入口动作
OnEvent(pFSM, EVENT_ENTRY, 0, 0);
}
/* 从根状态开始,停止当前所有的活动状态
* 调用这些状态的退出动作,顺序从叶子状态到根状态
*/
void CState::Deactive(CFSM * pFSM)
{
if (m_pActive)
{
// 停止活动子状态
m_pActive->Deactive(pFSM);
m_pActive = NULL;
}
// 调用自己的退出动作
OnEvent(pFSM, EVENT_EXIT, 0, 0);
}
const char * CState::GetActiveLeaf()
{
CState * pLeaf = this;
while (pLeaf->m_pActive)
pLeaf = pLeaf->m_pActive;
return pLeaf->m_pName;
}
bool CState::IsActive()
{
if (! m_pParent)
// 根状态总是活动的
return true;
else if (m_pParent->m_pActive == this)
return true;
else
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -