FSM
有限状态机的编写
(1)相比if--else--then 状态逻辑它的优点:
编写快速简单,易于调试,很少的计算开销,直觉性,灵活性
(2)视频游戏中常常把状态封装成对象,包含推动状态转变所需要的逻辑
状态接口:
State
类
class State
{
public:
virtual void Execute(Troll* troll);
};
Troll
巨魔类
为巨魔类赋予有限状态机的功能性,只需增添一个指向
State
类继承对象的实例指针(
State* m_pCurrentState
)和允许用户改变指针的指向实例的方法(
ChangeState
())
(3)一个简单的实例
- class State
- {
- public:
- virtual void Execute(Troll* troll);
- };
- class Troll// 巨魔类
- {
- State* m_pCurrentState;
- public :
- void Update()
- {
- m_pCurrentState->Execute(this);
- }
- void ChangeState(const State* pNewState)
- {
- delete m_pCurrentState;
- m_pCurrentState = pNewState;
- }
- };
- class State_RunAway:public State//逃跑(当前状态的逻辑为逃跑)
- {
- public :
- void Execute(Troll* troll)
- {
- if(troll->isSafe())
- {
- troll->ChangeState(new State_Sleep);
- }
- else
- {
- troll->MoveAwayFromEnemy();
- }
- }
- };
- class State_Sleep: public State//睡觉(当前状态的逻辑为睡觉)
- {
- public :
- void Execute(Troll* troll)
- {
- if(troll->isThreatened())
- {
- troll->ChangeState(new State_RunAway);
- }
- else
- {
- troll->Snore();
- }
- }
- };
(
4
)
Troll
类更新时,他会反过来用
this
指针调用当前状态类型的
Execute
方法。
Troll
类当更新时又怎样的行为可以完全依赖与他的当前状态的逻辑