version: cocos2d-x 3.6ide
状态机主要分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机;第二类,输出不只和状态有关并且和输入有关系,则称为Mealy状态机。函数
例如一个跑酷游戏,角色有以下状态:跑动,滑行,起跳,下落,飞行等。每个状态有持续时间,和该状态期间的处理逻辑,当前状态由用户输入和上一个状态肯定。那么很容易想到角色的状态变化经过状态机来实现,很是的方便。lua
每一个状态的进入、退出和持续过程都有本身的逻辑,因此咱们要为每个状态实现它们本身的逻辑处理接口。设计
状态函数的参数根据本身项目的需求来设计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
各状态的逻辑实现后,那么就能够实现状态机。其实它就是一个与状态相关的函数回调表。游戏
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
在游戏过程当中,Actor类会维护一个本身当前状态的变量 self.curState
it
self.stateMachine[self.curState].FUNC_UPDATE(self, dtTime, curTime)
self.stateMachine[self.curState].FUNC_ONEXIT(self) self.stateMachine[nextState].FUNC_ONENTER(self)