/// 分层状态类 #ifndef RUMetaState_h #define RUMetaState_h #include "RUState.h" NS_RU_BEGIN class StateMachine; class MetaState : public State { public: MetaState() = default; ~MetaState() = default; static MetaState* create(const std::string& stateName, const std::vector& fullStatePath, kStateType stateType, const std::vector& entryActInfos, const std::vector& idleActInfos, const std::vector& exitActInfos, const std::string & stateDelegateKey, void* userObj4StateDelegate, StateMachine* stateMachine); /************状态相关************/ /// 重载父类状态的进入方法(需要启动状态机) virtual void entry(const std::function& entryCb = nullptr) override; /// 重载父类状态的待机方法(需要启动状态机) virtual void idle(const std::function& idleCb = nullptr) override; /// 重载父类状态的退出方法(需要停止状态机) virtual void exit(const std::function& exitCb = nullptr) override; /* 重载往下穿透查找历史最后运行或即将运行的原子状态 对于家装而言只有最原子普通状态会绑定block(执行动作绑定到block上) */ virtual std::vector getBindingStatePath4Blocks() override; /************状态机相关************/ /// 设置运行状态(分层状态机需要往下传递) virtual void setRunningStateNames(const std::vector& stateNames); virtual std::vector getRunningStateNames(); virtual std::vector getHistoryRunningStateNames(); ///初始状态 virtual std::vector getInitStateNames(); /// 是否能响应事件 virtual bool canResponseEvent(const std::string& eventName); /// 响应事件 virtual void handleEvent(const std::string& eventName, const std::map& eventParams, const std::function& handleEventCb = nullptr); ///获取Idle动作的配置信息 virtual const std::vector& getIdleActInfosByStateFullPath(const std::vector& stateNames); ///立即停止状态机 virtual void stopMachineImmediately(); /// debug输出子状态机结构信息 virtual void debugStateMachineInfo(); /// 设置某个参数 /// @param name 参数名 /// @param v 参数值 virtual void setParam(const std::string& name, const std::string& v); virtual void setIndent4Dbg(const std::string& indent) override; ///调试用:运行状态机 virtual void runMachine4Dbg(); ///调试用:根据事件直接设置物件状态,不做动画 virtual void handleEvent4Dbg(const std::string& eventName); /** * 功能:检查指定的状态在状体机里是否存在 * 参数 stateNames:状态队列 * 返回值:状态队列的每一个状态是否能在对应的状态机响应 */ bool chekcStateNamesValidity(std::vector stateNames); private: StateMachine* _stateMachine = nullptr; }; NS_RU_END #endif /* RUMetaState_h */