【cocos2dx】状态机应用场景及原理

状态机应用场景及原理

状态机目的
例如
    local defaultEvents = {
        {name = "start", from = "none", to = "idle"},
        {name = "fire", from = "idle", to = "firing"},
        {name = "kill", from = "idle, firing", to = "dead"},
        {name = "relive", from - "dead", to = "idle"},
    }

采用的数据结构是数组+map,保存动作,上一状态名,下一状态名之间的关系。


管理动作和状态
  • 执行动作,检查状态是否合理,例如 relive时,from必须为dead
  • 执行动作,方法监听,onEnter+当前状态,onChange+当前状态, onLeaving + 上个状态
  • 执行动作,切换状态,self.state = to


实现思路
实现者先持有状态机, 然后注册1.状态和动作的对应关系 2.状态回调函数
   self.fsm__ = self:getComponent("components.behavior.StateMachine")


    -- 设定状态机的默认事件
    local defaultEvents = {
        -- 初始化后,角色处于 idle 状态
        {name = "start",  from = "none",    to = "idle" },
        -- 开火
        {name = "fire",   from = "idle",    to = "firing"},
        -- 开火冷却结束
        {name = "ready",  from = "firing",  to = "idle"},
        -- 角色被冰冻
        {name = "freeze", from = "idle",    to = "frozen"},
        -- 从冰冻状态恢复
        {name = "thaw",   form = "frozen",  to = "idle"},
        -- 角色在正常状态和冰冻状态下都可能被杀死
        {name = "kill",   from = {"idle", "frozen, firing"}, to = "dead"},
        -- 复活
        {name = "relive", from = "dead",    to = "idle"},
    }
    -- 如果继承类提供了其他事件,则合并 ???
    table.insertto(defaultEvents, checktable(events))


    -- 设定状态机的默认回调
    --[[
    onxxx或者onafterxxx: 执行xxx事件完成的响应函数;  (事件)
    onenterxxx或者onxxx: 进入xxx状态时的响应函数; (状态)
    onleavexxx: 离开xxx状态时的响应函数;  (状态)
    ]]
    local defaultCallbacks = {
        onchangestate = handler(self, self.onChangeState_),
        onstart       = handler(self, self.onStart_),
        onfire        = handler(self, self.onFire_),
        onready       = handler(self, self.onReady_),
        onfreeze      = handler(self, self.onFreeze_),
        onthaw        = handler(self, self.onThaw_),
        onkill        = handler(self, self.onKill_),
        onrelive      = handler(self, self.onRelive_),
        onleavefiring = handler(self, self.onLeaveFiring_),
    }

状态机实现对状态的保存,检验,和切换管理
        self.current_ = to -- this method should only ever be called once
        self:enterState_(event)
        self:changeState_(event)
        self:afterEvent_(event)




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值