马上面试,简历上写着熟悉FSM。虽然用过。但是还是需要熟悉一下。 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<OwnerType>* state);//添加状态。由于每个物体的状态都不一样 void changeState(int state);//切换状态 private: int curState;//当前状态 vector<State<OwnerType>*> vecState;//存储各个状态的指针 OwnerType* owner//状态机归属者 } StateMachine::StateMachine(OwnerType* owner) { curState=0; this->owner=owner; } void StateMachine::addState(State<OwnerType>* 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<Player>* stateMachine; } //创建玩家的各个状态 void Player::createAllStateMachine() { stateMachine=new StateMachine<Player>(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"<<endl; } void Player::run() { //实现功能 cout<<"run"<<endl; } void Player::attack() { //实现功能 cout<<"attack"<<endl; }