📄 fsm.cpp
字号:
#include "stdafx.h"
#include "AITypes.h"
#include "FSM.h"
#include <assert.h>
#include "WanderState.h"
#include "IdleState.h"
#include "TrackState.h"
#include "AttackState.h"
#include "DeadState.h"
#include "HelpState.h"
FSM::FSM()
{
Create();
}
FSM::~FSM()
{
Destroy();
}
// 惑怕 努贰胶 牢胶畔胶甸阑 积己窍绊 甘俊 眠啊茄促.
VOID FSM::Create()
{
AddState( STATE_ID_WANDER, new WanderState );
AddState( STATE_ID_IDLE, new IdleState );
AddState( STATE_ID_TRACK, new TrackState );
AddState( STATE_ID_ATTACK, new AttackState );
AddState( STATE_ID_DEAD, new DeadState );
AddState( STATE_ID_HELP, new HelpState );
}
// 甘俊 甸绢乐绰 惑怕 努贰胶甸阑 葛滴 昏力茄促.
VOID FSM::Destroy()
{
STATE_MAP_ITER it;
for( it = m_mapStates.begin(); it != m_mapStates.end(); ++it )
{
delete (it->second);
}
m_mapStates.clear();
}
VOID FSM::AddState( DWORD stateID, State *pState )
{
m_mapStates.insert( STATE_MAP_PAIR( stateID, pState ) );
}
// 炼扒捞 conditionID老 锭 stateID俊辑 outputStateID肺狼 惑怕 傈捞甫 眠啊茄促.
VOID FSM::AddTransition( DWORD stateID, DWORD conditionID, DWORD outputStateID )
{
STATE_MAP_ITER it = m_mapStates.find( stateID );
assert( it != m_mapStates.end() );
State *pState = it->second;
pState->AddTransition( conditionID, outputStateID );
}
VOID FSM::Init( NPC *pNPC, DWORD stateID )
{
m_pNPC = pNPC;
// 葛电 State 檬扁拳
STATE_MAP_ITER it;
for( it = m_mapStates.begin(); it != m_mapStates.end(); ++it )
{
it->second->SetFSM( this );
it->second->SetNPC( pNPC );
it->second->Init();
}
SetInitialState( stateID );
m_bStateChange = FALSE;
#ifdef _DEBUG
m_dwLastStateChangeCheckedTick = GetTickCount();
m_numStateChangePerSec = 0;
#endif
}
// 葛电 State甸阑 檬扁拳窍绊 贸澜 State甫 瘤沥茄促.
VOID FSM::SetInitialState( DWORD stateID )
{
STATE_MAP_ITER it;
// 贸澜 State
it = m_mapStates.find( stateID );
assert( it != m_mapStates.end() );
m_pCurState = it->second;
m_pCurState->OnEnter();
}
//=================================================================================================
// 漂沥 炼扒捞 惯积且 锭付促 捞 窃荐甫 龋免窍咯 惑怕 傈捞甫 蜡档窍档废 茄促.
//=================================================================================================
VOID FSM::Transition( DWORD conditionID )
{
m_dwNextStateID = m_pCurState->GetOutputState( conditionID );
ChangeState();
}
/*
//=================================================================================================
// 炼扒 惯积 溜矫 惑怕 傈捞甫 蜡档茄促.
//=================================================================================================
VOID FSM::ForcedTransition( DWORD conditionID )
{
Transition( conditionID );
ChangeState();
}
*/
VOID FSM::ChangeState()
{
m_bStateChange = FALSE;
// 官拆 惑怕狼 器牢磐甫 茫绰促.
STATE_MAP_ITER it = m_mapStates.find( m_dwNextStateID );
// 官拆 惑怕啊 沥狼登绢 乐瘤 臼篮 版快 府畔茄促.
if( it == m_mapStates.end() ) return;
// 官拆 惑怕啊 泅犁 惑怕客 鞍栏搁 弊成 府畔茄促.
if( it->second == m_pCurState ) return;
// printf( "state(%d) -> state(%d)\n", m_pCurState->GetStateID(), it->second->GetStateID() );
// 泅犁 惑怕狼 付公府 内靛
m_pCurState->OnExit();
// 惑怕 器牢磐 背眉
m_pCurState = it->second;
// 官诧 惑怕狼 檬扁拳 内靛
m_pCurState->OnEnter();
#ifdef _DEBUG
m_numStateChangePerSec++;
#endif
}
VOID FSM::Update()
{
m_pCurState->OnUpdate();
#ifdef _DEBUG
DWORD curTick = GetTickCount();
if( curTick - m_dwLastStateChangeCheckedTick > 1000 )
{
m_dwLastStateChangeCheckedTick = curTick;
m_numStateChangePerSec = 0;
}
assert( m_numStateChangePerSec < 10 );
#endif
}
VOID FSM::RemoveAllTransition()
{
STATE_MAP_ITER it;
for( it = m_mapStates.begin(); it != m_mapStates.end(); ++it )
{
it->second->RemoveAllTransition();
}
}
DWORD FSM::GetCurStateID()
{
return m_pCurState->GetStateID();
}
BOOL FSM::OnAIMsg( AI_MSG *pMsg )
{
return m_pCurState->OnAIMsg( pMsg );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -