?? 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);
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 + -