设计模式_实现简单的有限状态机(FSM)

马上面试,简历上写着熟悉FSM。虽然用过。但是还是需要熟悉一下。
设计模式_实现简单的有限状态机(FSM)_第1张图片
1.创建一个状态基类(抽象类)

//因为可能几种不同的游戏物体(玩家,敌人等)都要使用状态机,所以将其写成模板类。
template<class OwnerType>
Class State //所有状态的基类
{
public:
    //纯虚函数
    virtual void onEnter(OwnerType* ownerType)=0;//进入状态
    virtual void onExit(OwnerType* ownerType)=0;//退出状态
}

2.创建状态机类

template <class OwnerType>
class StateMachine()
{
public:
    StateMachine(OwnerType* owner);
    void addState(State* state);//添加状态。由于每个物体的状态都不一样
    void changeState(int state);//切换状态
private:
    int curState;//当前状态
    vector*> vecState;//存储各个状态的指针
    OwnerType* owner//状态机归属者
}
StateMachine::StateMachine(OwnerType* owner)
{
    curState=0;
    this->owner=owner;
}
void StateMachine::addState(State* state)
{
    vecState.push_back(state);//将状态添加到该对象的状态容器中,以便调用
}
void StateMachine::changeState(int state)
{
    vecState[curState]->onExit(owner);//退出当前状态
    curState=state;//改变状态
    vecState[curState]->onEnter(owner);//进入改变后的状态
}

3.创建实体类的全部状态

Class Player;
Class Idle:public State<Player>
{
public:
    virtual void onEnter(Player* owner);
    virtual void onExit(Player* owner);
}
void Idle::onEnter(Player* owner)
{
    owner->stopAllAction();
    owner->idle();
}
void Idle::onExit(Player* owner)
{

}
Class Run:public State<Player>
{
public:
    virtual void onEnter(Player* owner);
    virtual void onExit(Player* owner);
}
void Run::onEnter(Player* owner)
{
    owner->stopAllAction();
    owner->run();
}
void Run::onExit(Player* owner)
{
    owner->stopAllAction();
    owner->idle();
}
Class Attack:public State<Player>
{
public:
    virtual void onEnter(Player* owner);
    virtual void onExit(Player* owner);
}
void Attack::onEnter(Player* owner)
{
    owner->stopAllAction();
    owner->attack();
}
void Attack::onExit(Player* owner)
{
    owner->stopAllAction();
    owner->idle();
}

4.创建实体类使用状态机

enum PLAYER_STATE
{
    E_NULL,
    E_IDLE,
    E_RUN,
    E_ATTACK,
};
Class Player:public Sprite
{
public:
    virtual bool init();
    CREATE_FUNC(Player);
    //状态
    void idle();
    void run();
    void attack();
private:
    void createAllStateMachine();
private:
    StateMachine* stateMachine;
}
//创建玩家的各个状态
void Player::createAllStateMachine()
{
    stateMachine=new StateMachine(this);
    Idle* idle=new Idle();
    Run* run=new Run();
    Attack* attack=new Attack();
    stateMachine->addState(idle);
    stateMachine->addState(run);
    stateMachine->addState(attack);
}
//状态的实现
void Player::idle()
{
    //实现功能
    cout<<"idle"<void Player::run()
{
    //实现功能
    cout<<"run"<void Player::attack()
{
    //实现功能
    cout<<"attack"<

你可能感兴趣的:(设计模式)