quick cocos2d-x StateMachine 初体验

实现游戏中人物的几个状态转化,分别是:站立,行走,跳跃 三个状态。

状态转化图:

基本按照quick官方的sample实现了。现在贴下自己的代码:

  1 local StateMachineScene = class("StateMachineScene", function()
  2     return display.newScene("StateMachineScene")
  3 end)
  4
  5 function StateMachineScene:ctor()
  6     self.fsm_ = {}
  7     cc.GameObject.extend(self.fsm_):addComponent("components.behavior.StateMachine"):exportMethods()
  8     self.fsm_:setupState({
  9         events = {
 10             {name = "start", from = "none",   to = "stand" },
 11             {name = "stand_jump",  from = "stand",  to = "jump"},
 12             {name = "jump_stand", from = "jump",  to = "stand"},
 13             {name = "stand_walk", from = "stand", to = "walk"},
 14             {name = "walk_stand",  from = "walk",    to = "stand"},
 15             {name = "walk_jump", from = "walk",    to = "jump" }
 16         },
 17
 18         callbacks = {
 19             onbeforestart = function(event) print("[FSM] STARTING UP") end,
 20             onstart       = function(event) print("[FSM] READY") end,
 21             onbeforestand_jump  = function(event) print("[FSM] START   EVENT: stand_jump!", true) end,
 22             onbeforejump_stand = function(event) print("[FSM] START   EVENT: jump_stand!", true) end,
 23             onbeforestand_walk  = function(event) print("[FSM] START   EVENT: stand_walk!",  true) end,
 24             onbeforewalk_stand = function(event) print("[FSM] START   EVENT: walk_stand!", true) end,
 25             onbeforewalk_jump = function(event) print("[FSM] START   EVENT: walk_jump!", true) end,
 26             onstand_jump        = function(event) print("[FSM] FINISH  EVENT: stand_jump!") end,
 27             onjump_stand       = function(event) print("[FSM] FINISH  EVENT: jump_stand!") end,
 28             onstand_walk        = function(event) print("[FSM] FINISH  EVENT: stand_walk!") end,
 29             onwalk_stand       = function(event) print("[FSM] FINISH  EVENT: walk_stand!") end,
 30             onwalk_jump      = function(event) print("[FSM] FINISH  EVENT: walk_jump!") end,
 31             onleavestand  = function(event) print("[FSM] LEAVE   STATE: stand") end,
 32             onleavewalk = function(event) print("[FSM] LEAVE   STATE: walk") end,
 33             onleavejump    = function(event) print("[FSM] LEAVE   STATE: jump") end,
 34             onstand       = function(event) print("[FSM] ENTER   STATE: stand") self:ChangeTouchEnabled() end,
 35             onwalk      = function(event) print("[FSM] ENTER   STATE: walk") self:ChangeTouchEnabled() end,
 36             onjump         = function(event) print("[FSM] ENTER   STATE: jump") self:ChangeTouchEnabled() end,
 37             onchangestate = function(event) print("[FSM] CHANGED STATE: " .. event.from .. " to " .. event.to) end
 38         }
 39     })
 40 end
 41
 42 function StateMachineScene:onEnter()
 43     self.ttf1 = ui.newTTFLabelMenuItem({
 44         text = "walk_jump",
 45         size = 14,
 46         x = 100,
 47         y = 80,
 48         listener = function(event)
 49             self.fsm_:doEvent("walk_jump")
 50         end
 51     })
 52
 53     self.ttf2 = ui.newTTFLabelMenuItem({
 54         text = "walk_stand",
 55         size = 14,
 56         x = 200,
 57         y = 80,
 58         listener = function(event)
 59             self.fsm_:doEvent("walk_stand")
 60         end
 61     })
 62
 63     self.ttf3 = ui.newTTFLabelMenuItem({
 64         text = "stand_walk",
 65         size = 14,
 66         x = 300,
 67         y = 80,
 68         listener = function(event)
 69             self.fsm_:doEvent("stand_walk")
 70         end
 71     })
 72
 73     self.ttf4 = ui.newTTFLabelMenuItem({
 74         text = "jump_stand",
 75         size = 14,
 76         x = 400,
 77         y = 80,
 78         listener = function(event)
 79             self.fsm_:doEvent("jump_stand")
 80         end
 81     })
 82
 83     self.ttf5 = ui.newTTFLabelMenuItem({
 84         text = "stand_jump",
 85         size = 14,
 86         x = 400,
 87         y = 180,
 88         listener = function(event)
 89             self.fsm_:doEvent("stand_jump")
 90         end
 91     })
 92
 93     self:addChild(ui.newMenu({self.ttf1, self.ttf2, self.ttf3, self.ttf4, self.ttf5}))
 94
 95     self.fsm_:doEvent("start")
 96 end
 97
 98
 99 function StateMachineScene:ChangeTouchEnabled()
100     self.ttf1:setEnabled(self.fsm_:canDoEvent("walk_jump"))
101     self.ttf2:setEnabled(self.fsm_:canDoEvent("walk_stand"))
102     self.ttf3:setEnabled(self.fsm_:canDoEvent("stand_walk"))
103     self.ttf4:setEnabled(self.fsm_:canDoEvent("jump_stand"))
104     self.ttf5:setEnabled(self.fsm_:canDoEvent("stand_jump"))
105 end
106
107 return StateMachineScene

记录一下。留着以后自己使用。(上述代码,贴进player中就可以运行查看状态机的状态控制、流程走向了)

网上有几篇不错的讲quick状态机的文章。mark下:

http://cn.cocos2d-x.org/tutorial/show?id=1542

http://my.oschina.net/u/223340/blog/323464

时间: 2024-10-14 00:52:50

quick cocos2d-x StateMachine 初体验的相关文章

ipython及Python初体验

阅读目录: Python环境体验 Python编辑器 ipython安装 Python提示符 Python初体验 print和变量 变量操作 内建函数:方法 数学运算:简单算术.随机数 关于模块 一.Python环境体验 1.常见Python编辑器介绍 1.在linux下使用vim 编辑Python脚本时,推荐--没有道理-- 2.Eclipse 3.notepad++:挺好用的一款编辑工具 4.IDLE (官方自带)交互式的开发语言集成环境 5.pycharm  第三方的工具:ipython

erlang 初体验

最近测试了一下 erlang的坑... 如不出意外.... 大家第一眼看到这语法... 心里第一句一定是"我擦.这TM都是啥!!!!!" 没有变量!!! 没有结构体!!! 没有循环!!! 好吧,至少我是这样想的. 找了半天..连个if也不知道怎么写.. 这记录一些基本常识.. -module(module_name)  %%定义模块 括号内的要和文件名相同. -export([fun1/1 fun2/2]) %%这里是导出2个函数对外使用  函数名/参数名. 一个简单的函数定义如下 f

linux初体验

第一次听到linux这个'词语'是在一次偶然的朋友聊天中朋友提到的,之前压根没听到过'这个东西',所以我可以说是个linux的新新手,菜鸟都不算. 截至到目前,我已经开始linux系统运维学习有差不多10天时间了.在没接触linux之前,我对它的认识仅仅是:它是个计算机系统.决定学习linux系统运维之前,自我以为运维应该是对系统的一些日常维护之类的,不会很难的东西,我更希望运维是个不难的东西,我个人很笨,对难的东西可能接受的很慢,所以我愿意认为运维是很简单的,这样我就可以轻轻松松的掌握运维相关

【Spark深入学习 -15】Spark Streaming前奏-Kafka初体验

----本节内容------- 1.Kafka基础概念 1.1 出世背景 1.2 基本原理 1.2.1.前置知识 1.2.2.架构和原理 1.2.3.基本概念 1.2.4.kafka特点 2.Kafka初体验 2.1 环境准备 2.2 Kafka小试牛刀 2.2.1单个broker初体验 2.2.2 多个broker初体验 2.3 Kafka分布式集群构建 2.3.1 Kafka分布式集群构建 2.3.2 Kafka主题创建 2.3.3 生产者生产数据 2.3.4消费者消费数据 2.3.5消息的

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

hibernate--CRUD初体验

hibernate的crud操作初体验. 看具体实例 package com.fuwh.model; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import org.hibernate.annotations.GenericGenerator; @Entity publ

Oracle SQL篇(一)null值之初体验

    从我第一次正式的写sql语句到现在,已经超过10年的时间了.我写报表,做统计分析和财务对账,我一点点的接触oracle数据库,并尝试深入了解.这条路,一走就是10年,从充满热情,到开始厌倦,我不知道我还能坚持多久,未来的路,谁知道呢? 也许是该抓紧时间,做一点什么了,我不知道该开始写些什么,我从来没有在网上写东西的习惯.     先从简单的开始吧,那当然就是SQL,这是我SQL系列的第一篇,希望我能够坚持. 在Oracle数据库中,如果一个表中的列没有值的话,我们可以说是空值,比如IT员

AngularJS路由系列(3)-- UI-Router初体验

本系列探寻AngularJS的路由机制,在WebStorm下开发. AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Router初体验4.AngularJS路由系列(4)-- UI-Router的$state服务.路由事件.获取路由参数5.AngularJS路由系列(5)-- UI-Router的路由

Android Studio初体验之启动AVD模拟器异常:cannot set up guest memory 'pc.ram'

启动AVD模拟器异常:Cannot set up guest memory 'pc.ram' 错误信息: HAX is working and emulator runs in fast virt mode Cannot set up guest memory 'pc.ram': Invalid argument Error accepting connect 分析 各种查资料,没有发现网上有同样问题的,在一篇相关文章中找到类似的解决方法. 从语意看,应该是hax安装后没有启动.(不懂hax是什