?? fsm.cpp
字號:
// FSM.cpp: implementation of the CFSM class.
//
// 本程序是《瘋狂的火星蟲—面向?qū)ο鬆顟B(tài)機實踐指南》的演示程序
//
// 版權(quán)所有 (C) 2004 王詠武
// http://www.contextfree.net/wangyw/
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FSM.h"
CFSM::~CFSM()
{
// 釋放所有的狀態(tài)對象
vector<CState *>::iterator it;
for (it = m_States.begin(); it < m_States.end(); it ++)
if (*it)
delete *it;
}
void CFSM::ActiveDefaultState()
{
ASSERT(! m_States.empty());
if (! m_States.empty())
{
// 激活根狀態(tài)
(* m_States.begin())->Active(this, * m_States.begin());
// 激活根狀態(tài)到缺省葉子狀態(tài)
(* m_States.begin())->ActiveDefaultChild(this);
}
}
void CFSM::TransitTo(const char * lpName)
{
CState * pState = GetState(lpName);
// 找不到狀態(tài),說明用戶提供的狀態(tài)名不對
ASSERT(pState);
if (pState)
{
CState * pCommonAncestor = pState;
while (! pCommonAncestor->IsActive())
pCommonAncestor = pCommonAncestor->GetParent();
// 停止所有的活動狀態(tài)
pCommonAncestor->Deactive(this);
// 激活根狀態(tài)到目的狀態(tài)
pState->Active(this, pCommonAncestor);
// 激活目的狀態(tài)到缺省葉子狀態(tài)
pState->ActiveDefaultChild(this);
}
}
void CFSM::SendEvent(WORD wEvent, WORD wParam, DWORD lParam)
{
ASSERT(! m_States.empty());
if (! m_States.empty())
{
// 發(fā)送事件給根狀態(tài)
(* m_States.begin())->SendEvent(this, wEvent, wParam, lParam);
}
}
const char * CFSM::GetActiveLeaf()
{
ASSERT(! m_States.empty());
if (! m_States.empty())
{
return (* m_States.begin())->GetActiveLeaf();
}
return NULL;
}
CState * CFSM::GetState(const char * lpName)
{
CState * pState = NULL;
// 根據(jù)名字得到狀態(tài)的指針
for (int i = 0; i < m_States.size(); i++)
if (! strcmp(m_States[i]->GetName(), lpName))
{
pState = m_States[i];
break;
}
return pState;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -