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. arduino图形化编程——ardublock

    下载地址:http://sourceforge.net/projects/ardublock/ 项目主页:https://github.com/taweili/ardublock 运行效果图 ardu ...

  2. 《Java数据结构与算法》笔记-CH2无序数组

    /** * 本章目标: * 1.自制数组类 * 2.有序数组:按关键字升降序排列:二分法查找 * 3.分析有序数组.大O表示法 */ /** * 自制数组类 书中有的地方有错误,本程序以修改 */ c ...

  3. 解决IE5、IE6、IE7与W3C标准的冲突,使用(IE7.js IE8.js)兼容

    如果分别用IE5.IE6.IE7浏览同一个网页,将可能出现不一样的效果. 这是它们之间对CSS的解析选择器不一样或错误和个别bug所导致.为了解决这些错误和bug. 我们不得不找到一个能平衡于它们之间 ...

  4. J2EE到底是什么

    目前所有的B/S系统应用可以分为:有状态(statefull)和无状态(stateless)两大类别. 有状态是指在整个系统的处理过程中要保留记住一些信息,而无状态则相反,每次request都是独立的 ...

  5. 高版本myeclipse破解以及优化

    1.破解图 破解myeclipse但是在默认安装目录没有发现common文件夹,该怎么办? 打开myeclipse:  Myclipse-->Installation Summary...,   ...

  6. Red5边源服务器集群部署

    http://www.myexception.cn/open-source/446184.html Red5简介: Red5是一个采用Java开发开源的Flash流媒体服务器.它支持:把音频(MP3) ...

  7. POJ 3026 Borg Maze(bfs+最小生成树)

    Borg Maze Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6634   Accepted: 2240 Descrip ...

  8. codeforces 629BFar Relative’s Problem

    B. Far Relative’s Problem time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  9. Linux优化之IO子系统监控与调优

    Linux优化之IO子系统 作为服务器主机来讲,最大的两个IO类型 : 1.磁盘IO 2.网络IO 这是我们调整最多的两个部分所在 磁盘IO是如何实现的 在内存调优中,一直在讲到为了加速性能,linu ...

  10. HDU 4460 Friend Chains (BFS,最长路径)

    题意:给定 n 个人,和关系,问你这个朋友圈里任意两者之间最短的距离是多少. 析:很明显的一个BFS,只要去找最长距离就好.如果不能全找到,就是-1. 代码如下: #pragma comment(li ...