enum EState{
eState_Min, // 未初始化状态
eState_One,
eState_Two,
...
eState_Max, // 用于异常检測
};
EState curState = eState_Min;
void update(){
switch(curState){
case eState_One:
onStateOne();
break;
case eState_Min:
onStateTwo();
break;
...
case eState_Max:
break;
default:
// 报错
}
}void onStateOne(){
}
void onStateTwo(){
}
...
全部,我们还须要一个转换状态的函数
void converToState(EState dstState){
curState = dstState;
}
当游戏规模较大,逻辑非常复杂后。在switch结构就会变得非常复杂。
这个纯虚函数用来处理当前状态的一些逻辑。
class BaseState{
public:
virtual ~BaseState() = 0;
virtual void execute() = 0;
BaseState::~BaseState(){}
};
class FSM{
public:
void converToState(BaseState *state){
if state then
delete m_curState;
m_curState = NULL;
end
m_curState = state;
}
void update(){
m_curState->onState()
}
protected:
BaseState* m_curState;
};class Monster{
public:
void update(){
m_SFM->update()
}
protected:
FSM* m_SFM;
};
class StateMove:BaseState{
public:
~BaseState(){}
void execute(){
// move,check
}
};
class StateFight:BaseState{
public:
~BaseState(){}
void execute(){
// fight。check
}
};
原文:http://www.cnblogs.com/mthoutai/p/6888830.html