RUStateMachine.h 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /// 状态机类
  2. #ifndef RUStateMachine_h
  3. #define RUStateMachine_h
  4. #include "RUDefine.h"
  5. #include <unordered_map>
  6. #include "RUStateDelegate.h"
  7. NS_RU_BEGIN
  8. class State;
  9. class StateTransition;
  10. #define DISPATCH_STATE_NAME "entry" //虚拟分发节点名称
  11. #define AUTO_EVENT_NAME "自动" //状态自动触发的事件名
  12. // 参数的类型
  13. typedef enum {
  14. PARAM_T_INT = 1,
  15. PARAM_T_FLOAT,
  16. PARAM_T_STRING,
  17. PARAM_T_TRIGGER
  18. } FsmParamType;
  19. // 状态机的参数
  20. typedef struct {
  21. std::string name; // 参数名称
  22. FsmParamType type; // 参数类型
  23. int iv;
  24. float fv;
  25. std::string sv;
  26. } FsmParameter;
  27. // 事件转移时的单个条件
  28. typedef struct {
  29. std::string name;
  30. std::string op;
  31. std::string v;
  32. } FsmTansCondition;
  33. //状态机转换
  34. typedef struct _FsmTransition
  35. {
  36. std::string fromState; //源状态
  37. std::string toState; //目标状态
  38. std::string eventName; //事件名
  39. std::list<std::list<FsmTansCondition>> conditions; //转移条件,里层的list是与的关系,外层的list是或的关系
  40. std::vector<StateActInfo> beforeSwitchActInfos; //切换状态前动作
  41. std::vector<StateActInfo> afterSwitchActInfos; //切换状态后动作
  42. } FsmTransition;
  43. class StateMachine : public cocos2d::Ref
  44. {
  45. public:
  46. static StateMachine* create(const std::string& stateMachineName,
  47. const std::string& initStateName,
  48. const std::unordered_map<std::string, State*>& states,
  49. const std::vector<FsmTransition>& transitions,
  50. const std::map<std::string, FsmParameter>& params);
  51. ///初始状态
  52. virtual std::vector<std::string> getInitStateNames();
  53. /// 设置运行状态
  54. virtual void setRunningStateName(const std::string& stateName);
  55. /// 设置运行状态(分层状态机需要往下传递)
  56. virtual void setRunningStateNames(std::vector<std::string> stateNames);
  57. virtual std::vector<std::string> getRunningStateNames();
  58. virtual std::vector<std::string> getHistoryRunningStateNames();
  59. virtual void runMachine(const std::function<void(void)>& runningCb = nullptr);
  60. ///播放退出动画后再停止状态机
  61. virtual void stopMachine(const std::function<void(void)>& stoppedCb = nullptr);
  62. ///立即停止状态机
  63. virtual void stopMachineImmediately();
  64. ///强制切换状态(如果当前不是运行运行态,不应该调用这个函数)
  65. virtual void forceToStateNames(const std::vector<std::string>& stateNames, const std::function<void(void)>& forcedCb = nullptr);
  66. /// 是否能响应事件
  67. virtual bool canResponseEvent(const std::string& eventName);
  68. /// 响应事件
  69. virtual void handleEvent(const std::string& eventName, std::function<void(void)> handleEventCb = nullptr);
  70. virtual void handleEvent(const std::string& eventName, const std::map<std::string, std::string>& eventParams, std::function<void(void)> handleEventCb = nullptr);
  71. ///获取Idle动作的配置信息
  72. virtual const std::vector<StateActInfo>& getIdleActInfosByStateFullPath(const std::vector<std::string>& stateNames);
  73. /// 设置某个参数
  74. /// @param name 参数名
  75. /// @param v 参数值
  76. virtual void setParam(const std::string& name, const std::string& v);
  77. /// debug输出结构信息
  78. virtual void debugInfo();
  79. /// 设置状态机的名称
  80. /// @param name 名称
  81. void setName(const std::string& name);
  82. void setIndent4Dbg(const std::string& indent);
  83. ///调试用:运行状态机
  84. void runMachine4Dbg();
  85. ///调试用:根据事件直接设置物件状态,不做动画
  86. void handleEvent4Dbg(const std::string& eventName);
  87. /// 获取State
  88. State* getState(const std::string& stateName);
  89. /**
  90. * 功能:检查指定的状态在状体机里是否存在
  91. * 参数 stateNames:状态队列
  92. * 返回值:状态队列的每一个状态是否能在对应的状态机响应
  93. */
  94. bool chekcStateNamesValidity(std::vector<std::string> stateNames);
  95. private:
  96. StateMachine() = default;
  97. ~StateMachine() = default;
  98. /// 获取状态下事件的转换信息
  99. const FsmTransition* _getFsmTransition(const std::string& formState, const std::string& eventName);
  100. /// debug日志专用
  101. std::string _getRunningStateStr4Debug();
  102. /// 检查该条件组是否成立
  103. /// @param conditions 条件组
  104. bool checkConditonGroup(const std::list<FsmTansCondition>& conditions);
  105. /// 判断名称是否能匹配上模式
  106. /// @param name 名称
  107. /// @param pattern 可能携带"*"的模式
  108. bool isEventNameMatched(const std::string& name, const std::string& pattern);
  109. /// 在状态切换完成后的处理
  110. /// @param handleEventCb 回调
  111. void handleIfStateChanged(std::function<void(void)> handleEventCb);
  112. private:
  113. std::string _name; // 状态机本身的名字
  114. std::string _initStateName; //初始默认状态
  115. std::string _runningStateName; //当前运行状态
  116. std::string _historyRunningStateName; //最后的运行状态
  117. bool _running = false; //状态机是否在运行中
  118. std::unordered_map<std::string, State*> _states; //所有状态
  119. std::vector<FsmTransition> _transitions; //所有状态迁移信息
  120. std::map<std::string, FsmParameter> _parameters; // 所有的参数
  121. int _cntAutoTrans2Hdl = 0; // 需要处理的自动事件的数量
  122. std::string _indent; // 调试输出时的偏移值
  123. StateTransition* _transitionDoing = nullptr;
  124. };
  125. NS_RU_END
  126. #endif /* RUStateMachine_h */