状态机的实现
来源:互联网 发布:凯立德端口查看 编辑:程序博客网 时间:2024/04/28 02:26
现在很多人在利用比较流行的开源游戏引擎cocos2d-x开发游戏,在游戏中免不了使用状态机,这里给大家一种我自认为好的状态机的实现O(∩_∩)O~。
先贴上代码:#ifndef BASESTATE_H #define BASESTATE_H template <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
这个是状态机的基类,使用的时候只需要在每个具体实例中申明一个状态机的类,然后完成自己的状态类的填写,即可完成一个高质量的状态机。注释很全有中文的也有英文的,有兴趣的童鞋可以讨论下这个设计是否合理。
0 0
- qt状态机的实现
- 标准状态机的实现
- 状态机的实现
- 状态机的实现
- lua实现的状态机
- 简单的状态机实现
- 状态机的实现
- 状态机的实现
- 单状态机的实现
- C语言状态机的实现
- 读书笔记: 状态机的简单实现
- 读卡器的状态机, python实现
- [Android] 简单的状态机实现
- 状态机的原理和实现
- 状态机实现
- 基于状态机的按键扫描的实现
- 基于状态机的按键扫描的实现
- 基于C语言的状态机实现技术
- MySQL高效分页解决方案集
- 黑马程序员 IO心得总结
- iOS中消息的传递机制
- oracle数据库中,数据表无法执行数据操作语句,提示记录已被锁住
- 为什么不要用 StringBuffer 和 Vector
- 状态机的实现
- java 的运行机制之classload
- Regex expressions in Java \\s vs.\\s+
- glutSwapBuffers函数用法
- 开始
- onNewIntent
- string和stringstream用法总结
- 黑马程序员——java-网络编程
- eclipse基础知识