状态机的实现

来源:互联网 发布:淘宝客优惠券软件下载 编辑:程序博客网 时间:2024/04/28 00:44

现在很多人在利用比较流行的开源游戏引擎cocos2d-x开发游戏,在游戏中免不了使用状态机,这里给大家一种我自认为好的状态机的实现O(∩_∩)O~。

先贴上代码:

#ifndef BASESTATE_H#define BASESTATE_Htemplate <class entity_type>class BaseState{public://BaseState(void){};virtual void Enter(entity_type*)=0;virtual void Execute(entity_type*)=0;virtual void Exit(entity_type*)=0;virtual ~BaseState(void){};};#endif // !BASESTATE_H

以上为状态类代码,O(∩_∩)O~。简单的只有 三个主要调用的函数,进入,执行,离开。

然后我们继续查看下状态机的基类,废话不多说,先上代码,这样新手可以直接拿走直接使用。、

#ifndef BASESTATEMACHINE_H#define BASESTATEMACHINE_H//////////////////////////////////////////////////////////////////////////// /// @file状态机基类/// @brief负责状态机的跳转/// @version 2.0//////////////////////////////////////////////////////////////////////////#include "BaseState.h"#include <assert.h>///////////////////////////////////////////////////////////////////////////// @class BaseStateMachine/// @brief 状态机基类////// \n本类负责模板状态机的所有处理template <class entity_type>class BaseStateMachine{private:entity_type *m_pOwner;///<指向拥有这个了实例的智能体的指针BaseState<entity_type>*m_pCurrentState;///<智能体的当前状态BaseState<entity_type>*m_pPreviousState;///<智能体的上一个状态BaseState<entity_type>*m_pGlobalState;///<每次FSM被更新时,这个状态被调用public:BaseStateMachine(entity_type* owner):m_pOwner(owner),m_pCurrentState(nullptr),m_pPreviousState(nullptr),m_pGlobalState(nullptr){}///////////////////////////////////////////////////////////////////////@brief 设置当前状态///@param [in]s 要设置的状态///@return 无返回值////////////////////////////////////////////////////////////////////void SetCurrentState(BaseState<entity_type> *s){m_pCurrentState = s;}///////////////////////////////////////////////////////////////////////@brief 设置全局状态///@param [in]s 要设置的状态///@return 无返回值////////////////////////////////////////////////////////////////////void SetGlobalState(BaseState<entity_type> *s){m_pGlobalState = s;}///////////////////////////////////////////////////////////////////////@brief 设置前面的状态///@param [in]s 要设置的状态///@return 无返回值////////////////////////////////////////////////////////////////////void SetPreviousState(BaseState<entity_type> *s){m_pPreviousState = s;}///////////////////////////////////////////////////////////////////////@brief 更新状态//////@return 无返回值////////////////////////////////////////////////////////////////////void Update()const{if (m_pGlobalState){m_pGlobalState->Execute(m_pOwner);}if (m_pCurrentState){m_pCurrentState->Execute(m_pOwner);}}///////////////////////////////////////////////////////////////////////@brief 改变状态///@param [in]s 要设置的状态///@return 无返回值////////////////////////////////////////////////////////////////////void ChangeState(BaseState<entity_type> *pNewState){//assert(PNewState && "<BaseStateMachine::ChangeState>:trying to change to a null state");///保留前一个状态记录m_pPreviousState = m_pCurrentState;///调用现有状态的退出方法m_pCurrentState->Exit(m_pOwner);///改变到一个新状态m_pCurrentState= pNewState;///调用新状态的进入方法m_pCurrentState->Enter(m_pOwner);}///////////////////////////////////////////////////////////////////////@brief 改变到上一状态//////@return 无返回值////////////////////////////////////////////////////////////////////void RevertToPreviousState(){ChangeState(m_pPreviousState);}///////////////////////////////////////////////////////////////////////@brief 查看当前状态//////@return BaseState<entity_type>*当前状态////////////////////////////////////////////////////////////////////BaseState<entity_type>* CurrentState() const{return m_pCurrentState; }///////////////////////////////////////////////////////////////////////@brief 查看全局状态//////@return BaseState<entity_type>* 全局状态////////////////////////////////////////////////////////////////////BaseState<entity_type>* GlobalState() const{return m_pGlobalState; }///////////////////////////////////////////////////////////////////////@brief 查看前一状态//////@return BaseState<entity_type>*前一状态////////////////////////////////////////////////////////////////////BaseState<entity_type>* PreviousState() const{return m_pPreviousState; }  //class passed as a parameter. bool  isInState(const BaseState<entity_type>& st)const{return typeid(*m_pCurrentState) == typeid(st);}};#endif // !BASESTATEMACHINE_H

这个是状态机的基类,使用的时候只需要在每个具体实例中申明一个状态机的类,然后完成自己的状态类的填写,即可完成一个高质量的状态机。注释很全有中文的也有英文的,有兴趣的童鞋可以讨论下这个设计是否合理。


原创粉丝点击