#pragma once #include "TDnFSMState.h" #include "TDnFSMTransitCondition.h" // À¯ÇÑ »óÅ ±â°è.. Çڵ鸵µÉ °´Ã¼ÀÎ ÅÛÇø´ ÀÎÀÚ´Â ½º¸¶Æ® Æ÷ÀÎÅ͸¦ »ó¼Ó¹ÞÀº ³à¼®À̶ó°í °¡Á¤ÇÔ. template < class EntityHandle > class TDnFiniteStateMachine: public TBoostMemoryPool> { private: EntityHandle m_hEntity; TDnFSMState* m_pEntryState; TDnFSMState* m_pNowState; vector< TDnFSMState* > m_vlpStates; vector< TDnFSMTransitCondition* > m_vlpConditions; TDnFiniteStateMachine( void ) {}; public: TDnFiniteStateMachine( EntityHandle hEntity ) : m_hEntity(hEntity), m_pEntryState( NULL ), m_pNowState( NULL ) {}; ~TDnFiniteStateMachine(void) { SAFE_DELETE_PVEC( m_vlpStates ); SAFE_DELETE_PVEC( m_vlpConditions ); } void Initialize( void ) { // Çڵ鸵µÉ °´Ã¼¿£ FSM state µéÀ» ±¸¼ºÇÏ´Â ÇÔ¼ö°¡ ¹Ýµå½Ã ±¸ÇöµÇ¾î ÀÖ¾î¾ß ÇÔ. //bool bSuccess = m_hEntity->MakeUpFSM(); //_ASSERT( bSuccess && "FSM ±¸¼º ½ÇÆÐ!" ); }; TDnFSMState* GetCurrentState( void ) { return m_pNowState; }; void AddState( TDnFSMState* pState ) { m_vlpStates.push_back( pState ); } void AddCondition( TDnFSMTransitCondition* pCondition ) { m_vlpConditions.push_back( pCondition ); } void SetEntryState( TDnFSMState* pState ) { m_pEntryState= pState; m_pNowState = pState; } void ChangeState( TDnFSMState* pState, LOCAL_TIME LocalTime, float fDelta ) { m_pNowState->OnLeave( LocalTime, fDelta ); m_pNowState = pState; m_pNowState->OnEntry( LocalTime, fDelta ); } void Process( LOCAL_TIME LocalTime, float fDelta ) { if( m_pNowState ) { TDnFSMState* pState = NULL; do { pState = m_pNowState->CanTransition(); if( pState ) ChangeState( pState, LocalTime, fDelta ); } while( pState ); m_pNowState->OnProcess( LocalTime, fDelta ); //TDnFSMState* pState = m_pNowState->CanTransition(); //if( pState ) // ChangeState( pState, LocalTime, fDelta ); //else //{ // m_pNowState->OnProcess( LocalTime, fDelta ); //} } } };