Quick StateMachine状态机
状态机quick中是一个亮点,假设我们做一款RPG游戏,一个角色通常会拥有idle,attack,walk。run,death这些状态,假设游戏角色的状态採用分支条件推断的话。会造成很庞大而难以维护。但一旦使用了状态机这样的模式。就会显得简单方便。
对于quick中的状态机是怎样实现的咱们先不去了解。首先看看怎样去使用它。
总结起来,假设让一个类拥有状态机,主要有两步:
1.创建状态机对象
2.初始化状态机,主要包含事件和回调函数
1.创建状态机组件
self.fsm = {}
cc.GameObject.extend(self.fsm):addComponent("components.behavior.StateMachine"):exportMethods()
这样就创建了一个状态机对象,接下来我们要对其初始化,事实上也就是设置各个状态的逻辑。
2.初始化状态机(设置状态逻辑)
设置状态逻辑是重写setupState方法,这当中有这么几个字段參数,
- initial:状态机的初始状态
- terminal (final):结束状态
- events:状态发生转变时相应的事件
- callbacks:发生转变时的回调函数
一般我们会设置initial,events和callbacks这三个。
先看events,在events中须要分清楚“事件”和“状态”,events採用table结构,比如我们来写一个
events = {
{name = "move", from = {"idle", "jump"}, to = "walk"},
}
这当中move是事件,就像触摸事件event.name那样,name表示事件名称,而from和to后面跟的idle。jump。walk表示状态。所以上面的意思就是。当运行move事件时,假设状态是idle或者jump。那么都会跳转到walk状态上。
from的状态能够是单一状态,也能够使集合状态。就是几个状态,但to的状态仅仅能唯一,不然程序还给你来个随机状态?肯定不行的。
所以这里须要想好我们的主角有哪些状态。当什么事件发生时。他会从什么状态变到什么状态上去。比如我简单这么写。
events = {
{name = "move", from = {"idle", "jump"}, to = "walk"},
{name = "attack", from = {"idle", "walk"}, to = "jump"},
{name = "normal", from = {"walk", "jump"}, to = "idle"},
},
解释一下,假设是normal事件。无论主角在走路walk还是跳跃jump,都会变成闲置idle状态。其它同理。
接下来一个重点是callbacks參数,
即所谓回调了,就是事件触发,会运行一系列的函数。
- onbeforeEVNET: 在事件EVENT開始前被激活
- onleaveSTATE: 在离开旧状态STATE时被激活
- onenterSTATE 或 onSTATE:在进入新状态STATE时被激活
- onafterEVENT 或 onEVENT:在事件EVENT结束后被激活
比如
callbacks = {
onenteridle = function () --或者 onidle
print("idle")
end,
},
此外还有5种通用型的回调来捕获全部事件和状态的变化:
- onbeforeevent: 在不论什么事件開始前被激活
- onleavestate: 在离开不论什么状态时被激活
- onenterstate:在进入不论什么状态时被激活
- onafterevent :在不论什么事件结束后被激活
- onchangestate :当状态发生改变的时候被激活
此外还有这些,
- fsm:isReady() :返回状态机是否就绪
- fsm:getState() :返回当前状态
- fsm:isState(state) :推断当前状态是否是參数state状态
- fsm:canDoEvent(eventName) :当前状态假设能完毕eventName相应的event的状态转换,则返回true
- fsm:cannotDoEvent(eventName) :当前状态假设不能完毕eventName相应的event的状态转换,则返回true
- fsm:isFinishedState() :当前状态假设是终于状态,则返回true
- fsm:doEventForce(name, ...) :强制对当前状态进行转换
local Player = class("Player", function ()
return display.newSprite("icon.png")
end)
function Player:ctor()
self:addStateMachine()
end
function Player:doEvent(event)
self.fsm:doEvent(event)
end
function Player:addStateMachine()
self.fsm = {}
cc.GameObject.extend(self.fsm):addComponent("components.behavior.StateMachine"):exportMethods()
self.fsm:setupState({
initial = "idle",
events = {
{name = "move", from = {"idle", "jump"}, to = "walk"},
{name = "attack", from = {"idle", "walk"}, to = "jump"},
{name = "normal", from = {"walk", "jump"}, to = "idle"},
},
callbacks = {
onenteridle = function ()
local scale = CCScaleBy:create(0.2, 1.2)
self:runAction(CCRepeat:create(transition.sequence({scale, scale:reverse()}), 2))
end,
onenterwalk = function ()
local move = CCMoveBy:create(0.2, ccp(100, 0))
self:runAction(CCRepeat:create(transition.sequence({move, move:reverse()}), 2))
end,
onenterjump = function ()
local jump = CCJumpBy:create(0.5, ccp(0, 0), 100, 2)
self:runAction(jump)
end,
},
})
end
return Player
local Player = import("..views.Player")
local MyScene = class("MyScene", function ()
return display.newScene("MyScene")
end)
function MyScene:ctor()
local player = Player.new()
player:setPosition(display.cx, display.cy)
self:addChild(player)
local function menuCallback(tag)
if tag == 1 then
player:doEvent("normal")
elseif tag == 2 then
player:doEvent("move")
elseif tag == 3 then
player:doEvent("attack")
end
end
local mormalItem = ui.newTTFLabelMenuItem({text = "normal", x = display.width*0.3, y = display.height*0.2, listener = menuCallback, tag = 1})
local moveItem = ui.newTTFLabelMenuItem({text = "move", x = display.width*0.5, y = display.height*0.2, listener = menuCallback, tag = 2})
local attackItem = ui.newTTFLabelMenuItem({text = "attack", x = display.width*0.7, y = display.height*0.2, listener = menuCallback, tag = 3})
local menu = ui.newMenu({mormalItem, moveItem, attackItem})
self:addChild(menu)
end
return MyScene
加入我们刚才的Player。记得import或者require,这里为了方便我就通过菜单button的形式来分别doEvent了。
Quick StateMachine状态机的更多相关文章
- Spring Boot 揭秘与实战(七) 实用技术篇 - StateMachine 状态机机制
文章目录 1. 环境依赖 2. 状态和事件 2.1. 状态枚举 2.2. 事件枚举 3. 状态机配置4. 状态监听器 3.1. 初始化状态机状态 3.2. 初始化状态迁移事件 5. 总结 6. 源代码 ...
- Spring Boot - StateMachine状态机
是Spring Boot提供的状态机的现成实现. 理论(有点像工作流) 需要定义一些状态的枚举,以及一些引起状态变化的事件的枚举. 每个状态可以对应的创建一个继承自org.springframewor ...
- 使用Spring StateMachine框架实现状态机
spring statemachine刚出来不久,但是对于一些企业的大型应用的使用还是十分有借鉴意义的. 最近使用了下这个,感觉还是挺好的. 下面举个例子来说下吧: 创建一个Spring Boot的基 ...
- 管理订单状态,该上状态机吗?轻量级状态机COLA StateMachine保姆级入门教程
前言 在平常的后端项目开发中,状态机模式的使用其实没有大家想象中那么常见,笔者之前由于不在电商领域工作,很少在业务代码中用状态机来管理各种状态,一般都是手动get/set状态值.去年笔者进入了电商领域 ...
- mina statemachine解读(一)
statemachine(状态机)在维护多状态数据时有非常好的作用,现在github上star排名最前的是squirrel-foundation以及spring-statemachine,而min ...
- 状态机引擎在vivo营销自动化中的深度实践 | 引擎篇02
本文是<vivo营销自动化技术解密>的第3篇文章,分析了营销自动化业务背景和状态机引入原因.状态机的三种基本实现方式,同时介绍了几种业界流行的开源状态机框架实现和特点,以及在项目开发过程中 ...
- bk.
http://ol.tgbus.com/zt2013/gzsnew/ 巴士盘点 十大游戏工作室 http://bbs.3dmgame.com/forum.php?mod=viewthread& ...
- jsplumb 中文教程
https://wdd.js.org/jsplumb-chinese-tutorial/#/ 1. jsplumb 中文基础教程 后续更新会在仓库:https://github.com/wangdua ...
- C#复习笔记(5)--C#5:简化的异步编程(异步编程的深入分析)
首先,阐明一下标题的这个“深入分析”起得很惭愧,但是又不知道该起什么名字,这个系列也主要是做一些复习的笔记,供自己以后查阅,如果能够帮助到别人,那自然是再好不过了. 然后,我想说的是异步方法的状态机真 ...
随机推荐
- KMP 知识点总结
KMP算法是BF算法的改进,主要是消除了主串指针的回溯,提高算法效率. 先简单介绍一下BF算法: 基本思路: 从目标串s的第一个字符开始和模式串的第一个字符比较,相等逐个比较后续字符,否则从目标串的第 ...
- extjs表单
Ext.onReady(function(){ Ext.BLANK_IMAGE_URL = '../ext/resources/images/default/s.gif'; Ext.QuickTi ...
- Java学习之道:jdk环境变量配置方法
JDK(Java Development Kit)是整个Java的核心,包含了Java执行环境.Java工具和Java基础类库.JDK作为JAVA开发的环境,无论是做JAVA开发还是做安卓开发,都必须 ...
- XML序列化反序列化—常用类
public class XMLSerializer { #region (public) xml序列化 /// <summary> /// ...
- Qt线程同步操作用QWaitCondition QMutex
可以看到Qt提供了一个等待事件发生的类QWaitCondition,当条件满足时可以唤醒其它等待的线程. 写一个类可以在线程间实现同步功能 #ifndef THREADEVENT_H #define ...
- 一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用
一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用 先上图: 现在的智能控制都是基于微控制器,随着智能的手持终端的普及,基于智能终端的控制就会越来越普遍. WIFI便是其中的一种.W ...
- 【ThinkingInC++】52、函数内部的静态变量
/** * 书本:[ThinkingInC++] * 功能:函数内部的静态变量 * 时间:2014年9月17日18:06:33 * 作者:cutter_point */ #include " ...
- Deep Learning(深度学习) 学习笔记(四)
神经概率语言模型,内容分为三块:问题,模型与准则,实验结果.[此节内容未完待续...] 1,语言模型问题 语言模型问题就是给定一个语言词典包括v个单词,对一个字串做出二元推断,推断其是否符合该语言表达 ...
- http://www.shengshiyouxi.com
android从Linux系统启动有4个步骤: (1) init进程启动 (2) Native服务启动 (3) System Server,Android服务启动 (4) Home启动 ...
- Android学习十九:ContentProvider初步
一.Content Provider基本概念 1.ContentProvider为存储和获取数据提供了统一的接口.ContentProvide对数据进行封装.不用关心数据存储的细节.使用表的形式来组织 ...