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)
cocos2d-x lua 实现状态机的更多相关文章
- lua全局状态机
本文内容基于版本:Lua 5.3.0 global_State概述 global_State结构,我们可以称之为Lua全局状态机.从Lua的使用者角度来看,global_State结构是完全感知不到的 ...
- 使用cocos2d脚本生成lua绑定
这几天要老大要求把DragonBones移到cocos2dx 3.0 里边,并且绑定lua使用接口.因为刚学lua,使用的引擎也刚从2.2改为3.0,各种不熟悉,折腾了好几天才弄完,有空了总结一下 这 ...
- lua学习项目笔记
这几天草草的浏览了一下电子版的<lua程序设计>,没有懂的地方就自动忽略了,挑拣了一些可以理解的部分一直在推进.推进至后面的时候已经浑浑噩噩的了,有种想看完这本书的强迫症的感觉.推进CAP ...
- 《Cocos2d-x实战 Lua卷》上线了
感谢大家一直以来的支持!各大商店均开始销售:京东:http://item.jd.com/11659697.html当当:http://product.dangdang.com/23659810.htm ...
- 【转】cocos2d-x Lua
Call custom c++ from Lua cocos2d-x lua binds c++ class, class functions ,enum and some global functi ...
- Cocos2d-x3.0下一个 Lua与C++打电话给对方
这里谈下Lua与C++如何实现相互通话 原来的连接:http://blog.csdn.net/qqmcy/article/details/26052771 DJLCData.h 实现类 // // D ...
- lua和c的亲密接触
介绍 lua和c的亲密接触,靠的是一个虚拟栈.lua通过这个虚拟栈来实现和c之间值的互传.栈上的每一个元素是一个lua值(nil,number,string...). 当lua调用c函数的时候,这个函 ...
- cocos2dx 3.3 C++工程添加lua支持
准备工作: 1. 拷贝cocos2d-x-3.3rc0\external\lua整个文件夹到项目中(如myProject\cocos2d\external\lua) 2. 拷贝cocos2d-x-3. ...
- xcode 运行 lua版本崩溃 解决方案
问题描述:运行到LuaStack::init() 崩溃 原因: luajit不支持arm64 解决方案:编译luajit64位静态库 a.可以直接下载别人编译好的库,然后直接覆盖cocos2d\ext ...
随机推荐
- 在eclipse中配置spark 0.9.1源码的开发环境
一.准备工作: 1.下载release版spark 0.9.1,本次用的版本是spark-0.9.1-bin-cdh4. 2.下载scala IDE 3.0.2,这个版本ide的支持scala 2.1 ...
- 王家林的81门一站式云计算分布式大数据&移动互联网解决方案课程第14门课程:Android软硬整合设计与框架揭秘: HAL&Framework &Native Service &App&HTML5架构设计与实战开发
掌握Android从底层开发到框架整合技术到上层App开发及HTML5的全部技术: 一次彻底的Android架构.思想和实战技术的洗礼: 彻底掌握Andorid HAL.Android Runtime ...
- HBase Shell手动移动Region
在生产环境中很有可能有那么几个Region比较大,但是都运行在同一个Regionserver中. 这个时候就需要手动将region移动到负载低的Regionserver中. 步骤: 1.找到要移动的r ...
- ocp 1Z0-042 121-178题解析
121. You want to create a new optimized database for your transactional production environment to be ...
- HDU 5794 A Simple Chess (容斥+DP+Lucas)
A Simple Chess 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5794 Description There is a n×m board ...
- POJ 3026 Borg Maze(bfs+最小生成树)
Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6634 Accepted: 2240 Descrip ...
- Linux查看物理内存信息
Linux查看物理内存信息 1. 查看内存大小 dmidecode|grep Size 输出 Runtime Size: 64 kB ROM Size: 4608 kB Installed Size: ...
- BestCoder Round #65 hdu5590(水题)
ZYB's Biology Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- Linux下的内核测试工具——perf使用简介
Perf是Linux kernel自带的系统性能优化工具.Perf的优势在于与Linux Kernel的紧密结合,它可以最先应用到加入Kernel的new feature.pef可以用于查看热点函数, ...
- 对于一个网站,如何禁止直接从浏览器Web browser中访问js文件
比如有一个网站,https://testsystem.infotest.com 在这个网站的内容文件目录下面,有一个scripts文件夹,该文件夹中有一个js文件,比如lukeTest.js文件 这样 ...