⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsm.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 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 + -