|
|
根据这篇文章怎么我就写不出来,大家看看是怎么回事?
http://www.nightin.net/main.asp?page=_5&item=_001
template< class EntityType >
class State
{
public:
virtual ~State() {}
virtual void Enter( EntityType* ) = 0;
virtual void Execute( EntityType* ) = 0;
virtual void Exit( EntityType* ) = 0;
};
template< class EntityType >
class StateMachine
{
private:
EntityType *m_pOwner; // FSM的拥有者
State< EntityType > *m_pCurrentState; // 目前所处的状态
public:
// 更新函数
void Update() const
{
if( m_pCurrentState )
m_pCurrentState->Execute( m_pOwner );
}
// 转换状态
void ChangeState( State< EntityType > *pNewState )
{
// assert( pNewState && "[StateMachine::ChangeState]: pNewState == NULL" );
// 调用上一个状态的结束函数
if( m_pCurrentState != NULL )
m_pCurrentState->Exit( m_pOwner );
m_pCurrentState = pNewState;
// 调用新状态的进入函数
m_pCurrentState->Enter( m_pOwner );
}
State< EntityType > * getstate(){
return m_pCurrentState;
}
};
class Peon
{
private:
StateMachine< eon> *m_pStateMachine;
public:
void Update()
{
m_pStateMachine->Update();
}
void ChangeState( State<Peon> *pNewState )
{ m_pStateMachine->ChangeState( pNewState );}
State<Peon>* GetLocation(){
return m_pStateMachine->getstate();
}
void ChangeLocation(State<Peon>* s){m_pStateMachine->ChangeState(s);}
};
#define GoldMine EnterMineAndDigForGold::GetInstance()
// 进入金矿采矿
class EnterMineAndDigForGold : public State< Peon >
{
private:
EnterMineAndDigForGold() {}
public:
// 使用Singleton设计模式
static EnterMineAndDigForGold *GetInstance();
// 进入状态时的动作
virtual void Enter( Peon *pPeon );
// 在次状态时的动作
virtual void Execute( Peon *pPeon );
// 离开状态时的动作
virtual void Exit( Peon *pPeon );
};
void EnterMineAndDigForGold::Enter( Peon *pPeon )
{
// 苦工同学钻入了地洞
if( pPeon->GetLocation() != GoldMine )
pPeon->ChangeLocation( GoldMine );
}
void EnterMineAndDigForGold::Execute( Peon *pPeon )
{
// 苦工同学在努力的挖矿……
// pPeon->AddToGoldCarried( 1 );
// 终于他挖完了
// if( pPeon->PocketFull() )
// #define _BackToGreatHall BackToGreatHall::GetInstance()
// pPeon->ChangeState( _BackToGreatHall );
}
void EnterMineAndDigForGold::Exit( Peon *pPeon )
{
}
// 一种实现 Singleton 的方式
EnterMineAndDigForGold *EnterMineAndDigForGold::GetInstance()
{
static EnterMineAndDigForGold Instance;
return &Instance;
}
void main()
{
Peon * p = new Peon;
p->Update();
}
/////其中的GoldMine指的是什么?是下面这样吗?
#define GoldMine EnterMineAndDigForGold::GetInstance()
|
|