状态变换表
// 状态基类
template <class entity_type> // 使State基类可以重用
class State : public Singleton<State> { // Singleton模式,共享状态实例,要注意派生类的实现中不能
public:
virtual void Enter(entity_type*) = 0;
virtual void Execute(entity_type*) = 0;
virtual void Exit(entity_type*) = 0;
};
// 实体类
class Troll {
public:
void update() {
m_pCurrentState->Execute(this);
}
void changeState(State* pNewState) {
m_pCurrentState->Exit(this);
m_pCurrentState = pNewState;
m_pCurrentState->Enter(this);
}
private:
State* m_pCurrentState;
};
// 逃跑状态
class State_RunAway : public State<State_RunAway> {
public:
void Execute(Troll* troll) {
if (troll->isSafe()) {
troll->changeState(State_Sleep::getInstance());
}
else {
troll->MoveAwayFromEnemy();
}
}
}
// 睡觉状态
class State_Sleep : public State<State_RunAway> {
public:
void Execute(Troll* troll) {
if (troll->isThreatened()) {
troll->changeState(State_RunAway::getInstance());
}
else {
troll->Snore();
}
}
}