Cocos2d-x 3.1.1 Lua示例 ActionManagerTest(动作管理)

48 篇文章 0 订阅
33 篇文章 0 订阅

https://blog.csdn.net/wwj_748/article/details/37595501


本篇博客介绍Cocos2d-x的动作管理例子,这个例子展示了Cocos2d-x的几个动作:
MoveTo——移动动作,移动到某一个点
MoveBy——移动动作,与MoveTo是类似的,只是MoveBy可以移动到某一个点然后按原路返回,提供reverse方法。
RotateTo——旋转动作,把某一精灵旋转到某一角度
RotateBy——旋转动作,把某一精灵旋转某个角度,它有一个方法reverse,它让对象按原路径旋转回
ScaleTo——缩放动作,把某一精灵(Sprite)放大或缩小到某一比例
Scaleby——缩放动作,把某一精灵(Sprite)放大或缩小多少比例,它有一个方法reverse,它让对象按原路径旋转回


这个例子涉及到的知识点有:
  • 创建动作序列,例如: cc.Sequence:create(cc.DelayTime:create(1.4),cc.CallFunc:create(removeThis)
  • 执行动作序列,例如:ret:runAction( cc.Sequence:create(cc.DelayTime:create(1.4),cc.CallFunc:create(removeThis)))

我们先来看一下这个例子的效果,特别制作动态图给大家展示:







具体代码实现,具体API的使用方法,希望各位能认真看,如果对其中所传参数不清楚和不理解的,可以请教百度老师或者到官网参考具体API,这是学习方法。
》》》ActionManagerTest.lua

[javascript]  view plain  copy
  1. local    kTagNode = 0   -- 结点标识  
  2. local    kTagGrossini = 1 --   
  3. local    kTagSequence = 2 --   
  4. -- 获取和这个 director 关联的调度器  
  5. local   scheduler = cc.Director:getInstance():getScheduler()  
  6. --------------------------------------------------------------------  
  7. --  
  8. -- Test1  
  9. --  
  10. --------------------------------------------------------------------  
  11.   
  12. local function CrashTest()  
  13.     -- 创建测试层  
  14.     local ret = createTestLayer("Test 1. Should not crash")  
  15.     -- 精灵,s_pPathGrossini为图片路径  
  16.     local  child = cc.Sprite:create(s_pPathGrossini)  
  17.     -- 显示到x=200,y=200的位置  
  18.     child:setPosition( 200,200 )  
  19.     ret:addChild(child, 1)  
  20.   
  21.     --Sum of all action's duration is 1.5 second.  
  22.     -- 旋转一个节点,1.5秒,旋转90度  
  23.     child:runAction(cc.RotateBy:create(1.5, 90))  
  24.     -- 执行动作序列,1.4秒延迟,淡出  
  25.     child:runAction(cc.Sequence:create(cc.DelayTime:create(1.4),cc.FadeOut:create(1.1)))  
  26.       
  27.     local function removeThis()  
  28.         -- 溢出孩子  
  29.         ret:getParent():removeChild(ret, true)  
  30.         Helper.nextAction()  
  31.     end  
  32.   
  33.     --After 1.5 second, self will be removed.  
  34.     -- 1.5秒之后,自身会被移除  
  35.     ret:runAction( cc.Sequence:create(cc.DelayTime:create(1.4),cc.CallFunc:create(removeThis)))  
  36.     return ret  
  37. end  
  38.   
  39.   
  40. --------------------------------------------------------------------  
  41. --  
  42. -- LogicTest  
  43. -- 逻辑测试  
  44. --------------------------------------------------------------------  
  45. local function LogicTest()  
  46.     local ret = createTestLayer("Logic test")  
  47.     -- 精灵,s_pPathGrossini为图片路径  
  48.     local  grossini = cc.Sprite:create(s_pPathGrossini)  
  49.     -- 添加一个子节点到容器中,有Z轴顺序和一个标记。  
  50.     ret:addChild(grossini, 0, 2)  
  51.     grossini:setPosition(200,200)  
  52.     local function bugMe(node)  
  53.         -- 停止所有动作  
  54.         node:stopAllActions() --After this stop next action not working, if remove this stop everything is working  
  55.         node:runAction(cc.ScaleTo:create(2, 2))  
  56.     end  
  57.     -- 运行动作序列  
  58.     grossini:runAction( cc.Sequence:create(cc.MoveBy:create(1, cc.p(150,0)) ,cc.CallFunc:create(bugMe)))  
  59.     return ret  
  60. end  
  61.   
  62. --------------------------------------------------------------------  
  63. --  
  64. -- PauseTest  
  65. -- 暂停测试  
  66. --------------------------------------------------------------------  
  67.   
  68. local function PauseTest()  
  69.     local ret = createTestLayer("Pause Test")  
  70.     local schedulerEntry = nil  
  71.     local function unpause(dt)  
  72.         scheduler:unscheduleScriptEntry(schedulerEntry)  
  73.         schedulerEntry = nil  
  74.         local  node = ret:getChildByTag( kTagGrossini )  
  75.         local  pDirector = cc.Director:getInstance()  
  76.         pDirector:getActionManager():resumeTarget(node)  
  77.     end  
  78.   
  79.     local function onNodeEvent(event)  
  80.         -- 进入时  
  81.         if event == "enter" then  
  82.             local  s = cc.Director:getInstance():getWinSize()  
  83.             local  l = cc.Label:createWithTTF("After 3 seconds grossini should move""fonts/Thonburi.ttf", 16)  
  84.             ret:addChild(l)  
  85.             l:setAnchorPoint(cc.p(0.5, 0.5))  
  86.             l:setPosition( cc.p(s.width / 2, 245) )  
  87.               
  88.             local  grossini = cc.Sprite:create(s_pPathGrossini)  
  89.             ret:addChild(grossini, 0, kTagGrossini)  
  90.             grossini:setPosition(cc.p(200,200))  
  91.               
  92.             -- 创建移动动作,持续时间1秒,移动到(150,0)的位置  
  93.             local  action = cc.MoveBy:create(1, cc.p(150,0))  
  94.   
  95.             local  pDirector = cc.Director:getInstance()  
  96.             -- 通过获取director关联的ActionManager并为目标添加动作  
  97.             -- 为一个目标添加动作。 如果目标已经存在,动作将被加在已经存在的目标上。  
  98.             -- 如果目标不存在,将会创建这个目标的新对象,这个动作将被添加在这个新创建出来的对象上 当目标动作被暂停,动作队列的顺序也不会乱。  
  99.             pDirector:getActionManager():addAction(action, grossini, true)  
  100.   
  101.             schedulerEntry = scheduler:scheduleScriptFunc(unpause, 3.0, false)  
  102.         -- 退出  
  103.         elseif event == "exit" then  
  104.             if schedulerEntry ~= nil then  
  105.                 scheduler:unscheduleScriptEntry(schedulerEntry)  
  106.             end  
  107.         end  
  108.     end  
  109.     -- 注册响应事件  
  110.     ret:registerScriptHandler(onNodeEvent)  
  111.     return ret  
  112. end  
  113.   
  114. --------------------------------------------------------------------  
  115. --  
  116. -- RemoveTest  
  117. --   
  118. --------------------------------------------------------------------  
  119. local function RemoveTest()  
  120.     local ret = createTestLayer("Remove Test")  
  121.     local  l = cc.Label:createWithTTF("Should not crash""fonts/Thonburi.ttf", 16)  
  122.     -- 获得屏幕大小  
  123.     local  s = cc.Director:getInstance():getWinSize()  
  124.     ret:addChild(l)  
  125.     l:setAnchorPoint(cc.p(0.5, 0.5))  
  126.     l:setPosition( cc.p(s.width / 2, 245))  
  127.   
  128.     -- 创建移动动作,持续2秒,到(200,0)的位置  
  129.     local  pMove = cc.MoveBy:create(2, cc.p(200, 0))  
  130.     -- 停止动作  
  131.     local function stopAction()  
  132.         -- 根据Tag来获取子节点  
  133.         local  pSprite = ret:getChildByTag(kTagGrossini)  
  134.         pSprite:stopActionByTag(kTagSequence)  
  135.     end  
  136.       
  137.     -- 创建一个回调函数  
  138.     local callfunc = cc.CallFunc:create(stopAction)  
  139.     local  pSequence = cc.Sequence:create(pMove,callfunc)  
  140.     pSequence:setTag(kTagSequence)  
  141.   
  142.       
  143.     local  pChild = cc.Sprite:create(s_pPathGrossini)  
  144.     pChild:setPosition( 200, 200 )  
  145.   
  146.     ret:addChild(pChild, 1, kTagGrossini)  
  147.     pChild:runAction(pSequence)  
  148.     return ret  
  149. end  
  150.   
  151.   
  152. --------------------------------------------------------------------  
  153. --  
  154. -- ResumeTest  
  155. -- 恢复测试  
  156. --------------------------------------------------------------------  
  157. local function ResumeTest()  
  158.     local ret = createTestLayer("Resume Test")  
  159.   
  160.     local schedulerEntry = nil  
  161.     local function resumeGrossini(time)  
  162.         scheduler:unscheduleScriptEntry(schedulerEntry)  
  163.         schedulerEntry = nil  
  164.         local  pGrossini = ret:getChildByTag(kTagGrossini)  
  165.         local  pDirector = cc.Director:getInstance()  
  166.         pDirector:getActionManager():resumeTarget(pGrossini)  
  167.     end  
  168.   
  169.   
  170.     local function onNodeEvent(event)  
  171.         if event == "enter" then  
  172.             local  l = cc.Label:createWithTTF("Grossini only rotate/scale in 3 seconds""fonts/Thonburi.ttf", 16)  
  173.             ret:addChild(l)  
  174.             local  s = cc.Director:getInstance():getWinSize()  
  175.             l:setAnchorPoint(cc.p(0.5, 0.5))  
  176.             l:setPosition( s.width / 2, 245)  
  177.   
  178.             local  pGrossini = cc.Sprite:create(s_pPathGrossini)  
  179.             ret:addChild(pGrossini, 0, kTagGrossini)  
  180.             pGrossini:setPosition(200,200)  
  181.               
  182.             -- 运行缩放的动作  
  183.             pGrossini:runAction(cc.ScaleBy:create(2, 2))  
  184.   
  185.             local  pDirector = cc.Director:getInstance()  
  186.             -- 暂停目标  
  187.             pDirector:getActionManager():pauseTarget(pGrossini)  
  188.             -- 运行旋转动作,旋转360度,持续2秒  
  189.             pGrossini:runAction(cc.RotateBy:create(2, 360))  
  190.   
  191.             schedulerEntry = scheduler:scheduleScriptFunc(resumeGrossini, 3.0, false)  
  192.         elseif event == "exit" then  
  193.             if schedulerEntry ~= nil then  
  194.                 scheduler:unscheduleScriptEntry(schedulerEntry)  
  195.             end  
  196.         end  
  197.     end  
  198.   
  199.     ret:registerScriptHandler(onNodeEvent)  
  200.   
  201.     return ret  
  202. end  
  203.   
  204.   
  205. function ActionManagerTestMain()  
  206.     cclog("ActionManagerTestMain")  
  207.     Helper.index = 1 -- 初始索引为1  
  208.     -- 设置深度测试  
  209.     cc.Director:getInstance():setDepthTest(true)  
  210.     -- 创建场景  
  211.     local scene = cc.Scene:create()  
  212.     -- 初始化方法表  
  213.     Helper.createFunctionTable = {  
  214.         CrashTest,  
  215.         LogicTest,  
  216.         PauseTest,  
  217.         RemoveTest,  
  218.         ResumeTest  
  219.     }  
  220.     -- 添加层  
  221.     scene:addChild(CrashTest())  
  222.     scene:addChild(CreateBackMenuItem())  
  223.     return scene  
  224. end  

在例子中用到一些定义好的资源路径,还有相关帮助类,童鞋们可以到可以到相应目录下进行查找:
help.lua(帮助类,封装定义了相关方法,创建测试层、切换场景等)
[javascript]  view plain  copy
  1. require "Cocos2d"  
  2.   
  3. CC_CONTENT_SCALE_FACTOR = function()  
  4.   -- 获取surface的大小,单位为像素  
  5.   return cc.Director:getInstance():getContentScaleFactor()  
  6. end  
  7.   
  8. --把以像素为单位的矩形转换为以点为单位的矩形  
  9. CC_POINT_PIXELS_TO_POINTS = function(pixels)  
  10.   return cc.p(pixels.x/CC_CONTENT_SCALE_FACTOR(), pixels.y/CC_CONTENT_SCALE_FACTOR())  
  11. end  
  12.   
  13. -- 把以点为单位的矩形转换为以像素为单位的矩形  
  14. CC_POINT_POINTS_TO_PIXELS = function(points)  
  15.   return cc.p(points.x*CC_CONTENT_SCALE_FACTOR(), points.y*CC_CONTENT_SCALE_FACTOR())  
  16. end  
  17.   
  18.   
  19. -- cclog 打印日志  
  20. cclog = function(...)  
  21.   print(string.format(...))  
  22. end  
  23.   
  24. -- change table to enum type  把表转换为枚举类型  
  25. function CreateEnumTable(tbl, index)  
  26.   local enumTable = {}  
  27.   local enumIndex = index or -1  
  28.   for i, v in ipairs(tbl) do  
  29.     enumTable[v] = enumIndex + i  
  30.   end  
  31.   return enumTable  
  32. end  
  33.   
  34. -- back menu callback 返回菜单回调  
  35. local function MainMenuCallback()  
  36.   local scene = cc.Scene:create()  
  37.   scene:addChild(CreateTestMenu())  
  38.     
  39.   -- 切换场景  
  40.   cc.Director:getInstance():replaceScene(scene)  
  41. end  
  42.   
  43. -- add the menu item for back to main menu  
  44. -- 为返回主菜单添加菜单项  
  45. function CreateBackMenuItem()  
  46.   -- 创建一个标签  
  47.   local label = cc.Label:createWithTTF("MainMenu", s_arialPath, 20)  
  48.   -- 设置器锚点  
  49.   label:setAnchorPoint(cc.p(0.5, 0.5))  
  50.   -- 设置菜单项标签  
  51.   local MenuItem = cc.MenuItemLabel:create(label)  
  52.   MenuItem:registerScriptTapHandler(MainMenuCallback)  
  53.   
  54.   -- 获得屏幕大小  
  55.   local s = cc.Director:getInstance():getWinSize()  
  56.   -- 创建菜单  
  57.   local Menu = cc.Menu:create()  
  58.   -- 添加菜单项  
  59.   Menu:addChild(MenuItem)  
  60.   -- 设置菜单位置  
  61.   Menu:setPosition(0, 0)  
  62.   -- 设置菜单项位置,大致在右下角的位置  
  63.   MenuItem:setPosition(s.width - 50, 25)  
  64.   
  65.   return Menu  
  66. end  
  67.   
  68. -- 帮助类  
  69. Helper = {  
  70.   index = 1,  -- 索引  
  71.   createFunctioinTable = nil, -- 存储方法的表  
  72.   currentLayer = nil,   -- 当前层  
  73.   titleLabel = nil,     -- 标题  
  74.   subtitleLabel = nil   -- 子标题  
  75. }  
  76.   
  77. -- 下个动作  
  78. function Helper.nextAction()  
  79.   Helper.index = Helper.index + 1 -- 索引加1  
  80.   if Helper.index > table.getn(Helper.createFunctionTable) then  
  81.     Helper.index = 1   
  82.   end  
  83.   
  84.   return Helper.newScene()  
  85. end  
  86.   
  87. -- 回退动作  
  88. function  Helper.backAction()  
  89.   Helper.index = Helper.index - 1  
  90.   if Helper.index == 0 then  
  91.     Helper.index = table.getn(Helper.createFunctionTable)  
  92.   end  
  93.   
  94.   return Helper.newScene()  
  95. end  
  96.   
  97. -- 重新开始动作  
  98. function Helper.restartAction()  
  99.   return Helper.newScene()  
  100. end  
  101.   
  102. -- 切换新的场景  
  103. function Helper.newScene()  
  104.   local scene  
  105.   -- 如果使用物理效果  
  106.   if Helper.usePhysics then  
  107.     -- 创建一个带物理效果的场景  
  108.     scene = cc.Scene:createWithPhysics()  
  109.   else  
  110.     scene = cc.Scene:create()  
  111.   end  
  112.   Helper.currentLayer = Helper.createFunctionTable[Helper.index]()  
  113.   -- 添加当前层  
  114.   scene:addChild(Helper.currentLayer)  
  115.   -- 添加返回菜单  
  116.   scene:addChild(CreateBackMenuItem())  
  117.   
  118.   -- 切换场景  
  119.   cc.Director:getInstance():replaceScene(scene)  
  120. end  
  121.   
  122. -- 初始化层  
  123. function Helper.initWithLayer(layer)  
  124.   Helper.currentLayer = layer  
  125.   
  126.   -- 获取屏幕大小  
  127.   local size = cc.Director:getInstance():getWinSize()  
  128.   Helper.titleLabel = cc.Label:createWithTTF("", s_arialPath, 28)  
  129.   Helper.titleLabel:setAnchorPoint(cc.p(0.5, 0.5))  
  130.   layer:addChild(Helper.titleLabel, 1)  
  131.   Helper.titleLabel:setPosition(size.width / 2, size.height - 50)  
  132.   
  133.   Helper.subtitleLabel = cc.Label:createWithTTF("", s_thonburiPath, 16)  
  134.   Helper.subtitleLabel:setAnchorPoint(cc.p(0.5, 0.5))  
  135.   layer:addChild(Helper.subtitleLabel, 1)  
  136.   Helper.subtitleLabel:setPosition(size.width / 2, size.height - 80)  
  137.   
  138.   -- menu菜单  
  139.   local item1 = cc.MenuItemImage:create(s_pPathB1, s_pPathB2)  
  140.   local item2 = cc.MenuItemImage:create(s_pPathR1, s_pPathR2)  
  141.   local item3 = cc.MenuItemImage:create(s_pPathF1, s_pPathF2)  
  142.   item1:registerScriptTapHandler(Helper.backAction)  
  143.   item2:registerScriptTapHandler(Helper.restartAction)  
  144.   item3:registerScriptTapHandler(Helper.nextAction)  
  145.   
  146.   local menu = cc.Menu:create()  
  147.   menu:addChild(item1)  
  148.   menu:addChild(item2)  
  149.   menu:addChild(item3)  
  150.   menu:setPosition(cc.p(0, 0))  
  151.   -- 摆放三个菜单项的位置  
  152.   item1:setPosition(cc.p(size.width / 2 - item2:getContentSize().width * 2, item2:getContentSize().height / 2))  
  153.   item2:setPosition(cc.p(size.width / 2, item2:getContentSize().height / 2))  
  154.   item3:setPosition(cc.p(size.width / 2 + item2:getContentSize().width * 2, item2:getContentSize().height / 2))  
  155.   layer:addChild(menu, 1)  
  156.   
  157.   local background = cc.Layer:create()  
  158.   layer:addChild(background, -10)  
  159. end  
  160.   
  161. -- 创建测试层  
  162. function createTestLayer(title, subtitle)  
  163.   -- 创建一个层  
  164.   local layer = cc.Layer:create()  
  165.   Helper.initWithLayer(layer)  
  166.   local titleStr = title == nil and "No title" or title  
  167.   local subTitleStr = subtitle  == nil and "" or subtitle  
  168.   Helper.titleLabel:setString(titleStr)  
  169.   Helper.subtitleLabel:setString(subTitleStr)  
  170.   return layer  
  171. end  

testResource.lua
定义了所有的资源路径,方便管理和获取
[javascript]  view plain  copy
  1. s_pPathGrossini       = "Images/grossini.png"  
  2. s_pPathSister1        = "Images/grossinis_sister1.png"  
  3. s_pPathSister2        = "Images/grossinis_sister2.png"  
  4. s_pPathB1             = "Images/b1.png"  
  5. s_pPathB2             = "Images/b2.png"  
  6. s_pPathR1             = "Images/r1.png"  
  7. s_pPathR2             = "Images/r2.png"  
  8. s_pPathF1             = "Images/f1.png"  
  9. s_pPathF2             = "Images/f2.png"  
  10. s_pPathBlock          = "Images/blocks.png"  
  11. s_back                = "Images/background.png"  
  12. s_back1               = "Images/background1.png"  
  13. s_back2               = "Images/background2.png"  
  14. s_back3               = "Images/background3.png"  
  15. s_stars1              = "Images/stars.png"  
  16. s_stars2              = "Images/stars2.png"  
  17. s_fire                = "Images/fire.png"  
  18. s_snow                = "Images/snow.png"  
  19. s_streak              = "Images/streak.png"  
  20. s_PlayNormal          = "Images/btn-play-normal.png"  
  21. s_PlaySelect          = "Images/btn-play-selected.png"  
  22. s_AboutNormal         = "Images/btn-about-normal.png"  
  23. s_AboutSelect         = "Images/btn-about-selected.png"  
  24. s_HighNormal          = "Images/btn-highscores-normal.png"  
  25. s_HighSelect          = "Images/btn-highscores-selected.png"  
  26. s_Ball                = "Images/ball.png"  
  27. s_Paddle              = "Images/paddle.png"  
  28. s_pPathClose          = "Images/close.png"  
  29. s_MenuItem            = "Images/menuitemsprite.png"  
  30. s_SendScore           = "Images/SendScoreButton.png"  
  31. s_PressSendScore      = "Images/SendScoreButtonPressed.png"  
  32. s_Power               = "Images/powered.png"  
  33. s_AtlasTest           = "Images/atlastest.png"  
  34.   
  35. -- tilemaps resource  
  36. s_TilesPng            = "TileMaps/tiles.png"  
  37. s_LevelMapTga         = "TileMaps/levelmap.tga"  
  38.   
  39. -- spine test resource  
  40. s_pPathSpineBoyJson       = "spine/spineboy.json"  
  41. s_pPathSpineBoyAtlas       = "spine/spineboy.atlas"  
  42.   
  43. -- fonts resource  
  44. s_markerFeltFontPath   = "fonts/Marker Felt.ttf"  
  45. s_arialPath            = "fonts/arial.ttf"  
  46. s_thonburiPath         = "fonts/Thonburi.ttf"  
  47. s_tahomaPath           = "fonts/tahoma.ttf"  



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值