游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3786|回复: 0

状态机应用场景及原理

[复制链接]

6

主题

18

帖子

123

积分

注册会员

Rank: 2

积分
123
QQ
发表于 2016-1-12 20:55:46 | 显示全部楼层 |阅读模式
                                               状态机应用场景及原理

状态机目的
例如
    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)






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 12:21

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表