cocos2d-x lua 实现状态机

cocos2d-x lua 实现状态机

version: cocos2d-x 3.6ide

0.状态机

状态机主要分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机;第二类,输出不只和状态有关并且和输入有关系,则称为Mealy状态机。函数


1.应用场景

例如一个跑酷游戏,角色有以下状态:跑动,滑行,起跳,下落,飞行等。每个状态有持续时间,和该状态期间的处理逻辑,当前状态由用户输入和上一个状态肯定。那么很容易想到角色的状态变化经过状态机来实现,很是的方便。lua


2.实现

1) 各状态的处理

每一个状态的进入、退出和持续过程都有本身的逻辑,因此咱们要为每个状态实现它们本身的逻辑处理接口。设计

  • 状态函数的参数根据本身项目的需求来设计code

  • 各状态的update返回当前状态的完成度百分比,当返回100%说明该状态结束,须要切换到下一状态。如:下落过程当中,onUpdateFall返回100%说明着陆了,须要切换到跑状态(下一个状态也可经过update返回)。接口

local Actor = class("Actor")

-- 1.run
function Actor:onEnterRun()
    -- TODO 进入run状态时,进行该状态的初始化操做
end
function Actor:onUpdateRun(dtTime, curTime)
    -- TODO (每一帧都会调用)在run状态过程当中,进行的逻辑操做
    --return 0.5
    --return 1, nextState
end
function Actor:onExitRun()
    -- TODO 退出run状态是,进行该状态的退出处理
end

-- 2.glide 3.jump 4.fall 5.fly

return Actor

2) 实现状态机

各状态的逻辑实现后,那么就能够实现状态机。其实它就是一个与状态相关的函数回调表。游戏

Actor.FUNC_ONENTER = "onEnter"
Actor.FUNC_UPDATE  = "onUpdate"
Actor.FUNC_ONEXIT  = "onExit"

function Actor:initStateMachine()
    self.stateMachine = {}
    self.stateMachine["RUN"] = {
        Actor.FUNC_ONENTER = Actor.onEnterRun, 
        Actor.FUNC_UPDATE = Actor.onUpdateRun, 
        Actor.FUNC_ONEXIT = Actor.onExitRun
    }
    self.stateMachine["JUMP"] = {
        Actor.FUNC_ONENTER = Actor.onEnterJump, 
        Actor.FUNC_UPDATE = Actor.onUpdateJump, 
        Actor.FUNC_ONEXIT = Actor.onExitJump
    }
    -- TODO other state ....
end

3) 使用状态机

在游戏过程当中,Actor类会维护一个本身当前状态的变量 self.curStateit

  • 在游戏过程的每一帧,调用update以执行当前状态的逻辑处理。
self.stateMachine[self.curState].FUNC_UPDATE(self, dtTime, curTime)
  • 当用户输入、或当前状态结束时(即update返回100%,那么将切换状态)
self.stateMachine[self.curState].FUNC_ONEXIT(self)
self.stateMachine[nextState].FUNC_ONENTER(self)
相关文章
相关标签/搜索