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)

cocos2d-x lua 实现状态机的更多相关文章

  1. lua全局状态机

    本文内容基于版本:Lua 5.3.0 global_State概述 global_State结构,我们可以称之为Lua全局状态机.从Lua的使用者角度来看,global_State结构是完全感知不到的 ...

  2. 使用cocos2d脚本生成lua绑定

    这几天要老大要求把DragonBones移到cocos2dx 3.0 里边,并且绑定lua使用接口.因为刚学lua,使用的引擎也刚从2.2改为3.0,各种不熟悉,折腾了好几天才弄完,有空了总结一下 这 ...

  3. lua学习项目笔记

    这几天草草的浏览了一下电子版的<lua程序设计>,没有懂的地方就自动忽略了,挑拣了一些可以理解的部分一直在推进.推进至后面的时候已经浑浑噩噩的了,有种想看完这本书的强迫症的感觉.推进CAP ...

  4. 《Cocos2d-x实战 Lua卷》上线了

    感谢大家一直以来的支持!各大商店均开始销售:京东:http://item.jd.com/11659697.html当当:http://product.dangdang.com/23659810.htm ...

  5. 【转】cocos2d-x Lua

    Call custom c++ from Lua cocos2d-x lua binds c++ class, class functions ,enum and some global functi ...

  6. Cocos2d-x3.0下一个 Lua与C++打电话给对方

    这里谈下Lua与C++如何实现相互通话 原来的连接:http://blog.csdn.net/qqmcy/article/details/26052771 DJLCData.h 实现类 // // D ...

  7. lua和c的亲密接触

    介绍 lua和c的亲密接触,靠的是一个虚拟栈.lua通过这个虚拟栈来实现和c之间值的互传.栈上的每一个元素是一个lua值(nil,number,string...). 当lua调用c函数的时候,这个函 ...

  8. cocos2dx 3.3 C++工程添加lua支持

    准备工作: 1. 拷贝cocos2d-x-3.3rc0\external\lua整个文件夹到项目中(如myProject\cocos2d\external\lua) 2. 拷贝cocos2d-x-3. ...

  9. xcode 运行 lua版本崩溃 解决方案

    问题描述:运行到LuaStack::init() 崩溃 原因: luajit不支持arm64 解决方案:编译luajit64位静态库 a.可以直接下载别人编译好的库,然后直接覆盖cocos2d\ext ...

随机推荐

  1. linux 下的进程管理工具 supervisor

    在linux下监控进程: 1)yum install python-setuptools   linux下的python安装工具 2)easy_install supervisor     安装sup ...

  2. caldera

    Caldera International星期一宣布将公司名称变更为SCO Group,交易代码则改为SCOX,希望SCO可以在客户群当中建立更好的品牌认同. Caldera除了有自己的Linux版本 ...

  3. JavaFx版本植物大战僵尸

    http://www.cnblogs.com/lslvxy/archive/2013/04/17/3026711.html —————————————————————————————————————— ...

  4. linux 下终端复用软件推荐——tmux

    使用过些linux终端,比如Tilda.Terminator. 之前最经常用的是Terminator,其可以上下左右分屏,比较方便,但其有个缺点是经常无故崩溃. 后来遇到Tmux,根据网上的设置配置了 ...

  5. POJ 1847 Tram (最短路)

    Tram 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/N Description Tram network in Zagreb ...

  6. DATASNAP多表提交之事务控制之通用方法

    ERP系统的单据,总是些主从表结构,有一个主表,N个子表,子表又有子表,形成N层,单据数据提交时,主从表数据都要提交,为了保证数据的完整性,必须提供事务控制,要么都提交成功,有一个提交失败所有的提交都 ...

  7. Java 8 正式发布,新特性全搜罗

    经过2年半的努力.屡次的延期和9个里程碑版本,甲骨文的Java开发团队终于发布了Java 8正式版本. Java 8版本最大的改进就是Lambda表达式,其目的是使Java更易于为多核处理器编写代码: ...

  8. 解读XMP元数据中ALAssetRepresentation

    当用户进行某些更改(裁剪,消除红眼,...),在内置 Photos.app iOS上,这些更改将不会应用到由相应 fullResolutionImage 返回的 ALAssetRepresentati ...

  9. C++中使用函数指针 【瓦特芯笔记】

         在C++类中使用函数指针. 类型定义:      typedef 返回类型(类名::*新类型)(参数表) //类定义 class CA { public: char lcFun(int a) ...

  10. 《精通ASP.NET MVC5》第2章 第一个MVC应用程序

      控制器     public class NewHomeController : Controller     {         // GET: /NewHome/         public ...