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

posted @ 2014-12-04 15:37  Mr轨迹  阅读(776)  评论(0编辑  收藏  举报