|
状态机应用场景及原理
状态机目的
例如
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)
|
|