zoukankan      html  css  js  c++  java
  • cocos2d-x lua 实现状态机

    cocos2d-x lua 实现状态机

    version: cocos2d-x 3.6

    0.状态机

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


    1.应用场景

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


    2.实现

    1) 各状态的处理

    每个状态的进入、退出和持续过程都有自己的逻辑,所以我们要为每一个状态实现它们自己的逻辑处理接口。

    • 状态函数的参数根据自己项目的需求来设计

    • 各状态的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.curState

    • 在游戏过程的每一帧,调用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)
    
  • 相关阅读:
    使用jackson解析JSON数据
    ANT配置
    Android Webview 与JS交互
    使用ANT将Android打包成Jar包
    单例模式
    工厂模式
    nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 错误解决
    项目开发中的文档管理结构模板
    高并发的成熟解决方案
    Yaf(Yet Another Framework)用户手册 yii框架手册
  • 原文地址:https://www.cnblogs.com/songcf/p/4549821.html
Copyright © 2011-2022 走看看