zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    常用shell
    JavaScript基础
    CSS动画-页面特效
    CSS3常用操作
    CSS3的盒子模型
    CSS定位
    JQuery中的DOM操作
    [单词用法总结]-as
    JQuery选择器
    css选择器
  • 原文地址:https://www.cnblogs.com/vokie/p/4143016.html
Copyright © 2011-2022 走看看