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

  • Post author:
  • Post category:其他


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. — Test1



  8. ——————————————————————–


  9. local

    function


    CrashTest()


  10. — 创建测试层

  11. local ret = createTestLayer(

    “Test 1. Should not crash”


    )


  12. — 精灵,s_pPathGrossini为图片路径

  13. local  child = cc.Sprite:create(s_pPathGrossini)

  14. — 显示到x=200,y=200的位置

  15. child:setPosition( 200,200 )

  16. ret:addChild(child, 1)


  17. –Sum of all action’s duration is 1.5 second.

  18. — 旋转一个节点,1.5秒,旋转90度

  19. child:runAction(cc.RotateBy:create(1.5, 90))

  20. — 执行动作序列,1.4秒延迟,淡出

  21. child:runAction(cc.Sequence:create(cc.DelayTime:create(1.4),cc.FadeOut:create(1.1)))


  22. local

    function


    removeThis()


  23. — 溢出孩子

  24. ret:getParent():removeChild(ret,

    true


    )


  25. Helper.nextAction()

  26. end


  27. –After 1.5 second, self will be removed.

  28. — 1.5秒之后,自身会被移除

  29. ret:runAction( cc.Sequence:create(cc.DelayTime:create(1.4),cc.CallFunc:create(removeThis)))


  30. return


    ret


  31. end



  32. ——————————————————————–



  33. — LogicTest

  34. — 逻辑测试

  35. ——————————————————————–

  36. local

    function


    LogicTest()


  37. local ret = createTestLayer(

    “Logic test”


    )


  38. — 精灵,s_pPathGrossini为图片路径

  39. local  grossini = cc.Sprite:create(s_pPathGrossini)

  40. — 添加一个子节点到容器中,有Z轴顺序和一个标记。

  41. ret:addChild(grossini, 0, 2)

  42. grossini:setPosition(200,200)

  43. local

    function


    bugMe(node)


  44. — 停止所有动作

  45. node:stopAllActions() –After

    this


    stop next action not working,


    if


    remove


    this


    stop everything is working


  46. node:runAction(cc.ScaleTo:create(2, 2))

  47. end

  48. — 运行动作序列

  49. grossini:runAction( cc.Sequence:create(cc.MoveBy:create(1, cc.p(150,0)) ,cc.CallFunc:create(bugMe)))


  50. return


    ret


  51. end


  52. ——————————————————————–



  53. — PauseTest

  54. — 暂停测试

  55. ——————————————————————–


  56. local

    function


    PauseTest()


  57. local ret = createTestLayer(

    “Pause Test”


    )


  58. local schedulerEntry = nil

  59. local

    function


    unpause(dt)


  60. scheduler:unscheduleScriptEntry(schedulerEntry)

  61. schedulerEntry = nil

  62. local  node = ret:getChildByTag( kTagGrossini )

  63. local  pDirector = cc.Director:getInstance()

  64. pDirector:getActionManager():resumeTarget(node)

  65. end


  66. local

    function


    onNodeEvent(event)


  67. — 进入时


  68. if


    event ==


    “enter”


    then


  69. local  s = cc.Director:getInstance():getWinSize()

  70. local  l = cc.Label:createWithTTF(

    “After 3 seconds grossini should move”


    ,


    “fonts/Thonburi.ttf”


    , 16)


  71. ret:addChild(l)

  72. l:setAnchorPoint(cc.p(0.5, 0.5))

  73. l:setPosition( cc.p(s.width / 2, 245) )


  74. local  grossini = cc.Sprite:create(s_pPathGrossini)

  75. ret:addChild(grossini, 0, kTagGrossini)

  76. grossini:setPosition(cc.p(200,200))


  77. — 创建移动动作,持续时间1秒,移动到(150,0)的位置

  78. local  action = cc.MoveBy:create(1, cc.p(150,0))


  79. local  pDirector = cc.Director:getInstance()

  80. — 通过获取director关联的ActionManager并为目标添加动作

  81. — 为一个目标添加动作。 如果目标已经存在,动作将被加在已经存在的目标上。

  82. — 如果目标不存在,将会创建这个目标的新对象,这个动作将被添加在这个新创建出来的对象上 当目标动作被暂停,动作队列的顺序也不会乱。

  83. pDirector:getActionManager():addAction(action, grossini,

    true


    )



  84. schedulerEntry = scheduler:scheduleScriptFunc(unpause, 3.0,

    false


    )


  85. — 退出

  86. elseif event ==

    “exit”


    then



  87. if


    schedulerEntry ~= nil then


  88. scheduler:unscheduleScriptEntry(schedulerEntry)

  89. end

  90. end

  91. end

  92. — 注册响应事件

  93. ret:registerScriptHandler(onNodeEvent)


  94. return


    ret


  95. end


  96. ——————————————————————–



  97. — RemoveTest



  98. ——————————————————————–

  99. local

    function


    RemoveTest()


  100. local ret = createTestLayer(

    “Remove Test”


    )


  101. local  l = cc.Label:createWithTTF(

    “Should not crash”


    ,


    “fonts/Thonburi.ttf”


    , 16)


  102. — 获得屏幕大小

  103. local  s = cc.Director:getInstance():getWinSize()

  104. ret:addChild(l)

  105. l:setAnchorPoint(cc.p(0.5, 0.5))

  106. l:setPosition( cc.p(s.width / 2, 245))


  107. — 创建移动动作,持续2秒,到(200,0)的位置

  108. local  pMove = cc.MoveBy:create(2, cc.p(200, 0))

  109. — 停止动作

  110. local

    function


    stopAction()


  111. — 根据Tag来获取子节点

  112. local  pSprite = ret:getChildByTag(kTagGrossini)

  113. pSprite:stopActionByTag(kTagSequence)

  114. end


  115. — 创建一个回调函数

  116. local callfunc = cc.CallFunc:create(stopAction)

  117. local  pSequence = cc.Sequence:create(pMove,callfunc)

  118. pSequence:setTag(kTagSequence)



  119. local  pChild = cc.Sprite:create(s_pPathGrossini)

  120. pChild:setPosition( 200, 200 )


  121. ret:addChild(pChild, 1, kTagGrossini)

  122. pChild:runAction(pSequence)


  123. return


    ret


  124. end



  125. ——————————————————————–



  126. — ResumeTest

  127. — 恢复测试

  128. ——————————————————————–

  129. local

    function


    ResumeTest()


  130. local ret = createTestLayer(

    “Resume Test”


    )



  131. local schedulerEntry = nil

  132. local

    function


    resumeGrossini(time)


  133. scheduler:unscheduleScriptEntry(schedulerEntry)

  134. schedulerEntry = nil

  135. local  pGrossini = ret:getChildByTag(kTagGrossini)

  136. local  pDirector = cc.Director:getInstance()

  137. pDirector:getActionManager():resumeTarget(pGrossini)

  138. end



  139. local

    function


    onNodeEvent(event)



  140. if


    event ==


    “enter”


    then


  141. local  l = cc.Label:createWithTTF(

    “Grossini only rotate/scale in 3 seconds”


    ,


    “fonts/Thonburi.ttf”


    , 16)


  142. ret:addChild(l)

  143. local  s = cc.Director:getInstance():getWinSize()

  144. l:setAnchorPoint(cc.p(0.5, 0.5))

  145. l:setPosition( s.width / 2, 245)


  146. local  pGrossini = cc.Sprite:create(s_pPathGrossini)

  147. ret:addChild(pGrossini, 0, kTagGrossini)

  148. pGrossini:setPosition(200,200)


  149. — 运行缩放的动作

  150. pGrossini:runAction(cc.ScaleBy:create(2, 2))


  151. local  pDirector = cc.Director:getInstance()

  152. — 暂停目标

  153. pDirector:getActionManager():pauseTarget(pGrossini)

  154. — 运行旋转动作,旋转360度,持续2秒

  155. pGrossini:runAction(cc.RotateBy:create(2, 360))


  156. schedulerEntry = scheduler:scheduleScriptFunc(resumeGrossini, 3.0,

    false


    )


  157. elseif event ==

    “exit”


    then



  158. if


    schedulerEntry ~= nil then


  159. scheduler:unscheduleScriptEntry(schedulerEntry)

  160. end

  161. end

  162. end


  163. ret:registerScriptHandler(onNodeEvent)



  164. return


    ret


  165. end




  166. function


    ActionManagerTestMain()


  167. cclog(

    “ActionManagerTestMain”


    )


  168. Helper.index = 1 — 初始索引为1

  169. — 设置深度测试

  170. cc.Director:getInstance():setDepthTest(

    true


    )


  171. — 创建场景

  172. local scene = cc.Scene:create()

  173. — 初始化方法表

  174. Helper.createFunctionTable = {

  175. CrashTest,

  176. LogicTest,

  177. PauseTest,

  178. RemoveTest,

  179. ResumeTest

  180. }

  181. — 添加层

  182. scene:addChild(CrashTest())

  183. scene:addChild(CreateBackMenuItem())


  184. return


    scene


  185. end


在例子中用到一些定义好的资源路径,还有相关帮助类,童鞋们可以到可以到相应目录下进行查找:



help.lua(帮助类,封装定义了相关方法,创建测试层、切换场景等)


[javascript]


view plain


copy



  1. require


    “Cocos2d”





  2. CC_CONTENT_SCALE_FACTOR =

    function


    ()


  3. — 获取surface的大小,单位为像素


  4. return


    cc.Director:getInstance():getContentScaleFactor()


  5. end


  6. –把以像素为单位的矩形转换为以点为单位的矩形

  7. CC_POINT_PIXELS_TO_POINTS =

    function


    (pixels)



  8. return


    cc.p(pixels.x/CC_CONTENT_SCALE_FACTOR(), pixels.y/CC_CONTENT_SCALE_FACTOR())


  9. end


  10. — 把以点为单位的矩形转换为以像素为单位的矩形

  11. CC_POINT_POINTS_TO_PIXELS =

    function


    (points)



  12. return


    cc.p(points.x*CC_CONTENT_SCALE_FACTOR(), points.y*CC_CONTENT_SCALE_FACTOR())


  13. end



  14. — cclog 打印日志

  15. cclog =

    function


    (…)


  16. print(string.format(…))

  17. end


  18. — change table to

    enum


    type  把表转换为枚举类型



  19. function


    CreateEnumTable(tbl, index)


  20. local enumTable = {}

  21. local enumIndex = index or -1


  22. for


    i, v


    in


    ipairs(tbl)


    do




  23. enumTable[v] = enumIndex + i

  24. end


  25. return


    enumTable


  26. end


  27. — back menu callback 返回菜单回调

  28. local

    function


    MainMenuCallback()


  29. local scene = cc.Scene:create()

  30. scene:addChild(CreateTestMenu())


  31. — 切换场景

  32. cc.Director:getInstance():replaceScene(scene)

  33. end


  34. — add the menu item

    for


    back to main menu


  35. — 为返回主菜单添加菜单项


  36. function


    CreateBackMenuItem()


  37. — 创建一个标签

  38. local label = cc.Label:createWithTTF(

    “MainMenu”


    , s_arialPath, 20)


  39. — 设置器锚点

  40. label:setAnchorPoint(cc.p(0.5, 0.5))

  41. — 设置菜单项标签

  42. local MenuItem = cc.MenuItemLabel:create(label)

  43. MenuItem:registerScriptTapHandler(MainMenuCallback)


  44. — 获得屏幕大小

  45. local s = cc.Director:getInstance():getWinSize()

  46. — 创建菜单

  47. local Menu = cc.Menu:create()

  48. — 添加菜单项

  49. Menu:addChild(MenuItem)

  50. — 设置菜单位置

  51. Menu:setPosition(0, 0)

  52. — 设置菜单项位置,大致在右下角的位置

  53. MenuItem:setPosition(s.width – 50, 25)



  54. return


    Menu


  55. end


  56. — 帮助类

  57. Helper = {

  58. index = 1,  — 索引

  59. createFunctioinTable = nil, — 存储方法的表

  60. currentLayer = nil,   — 当前层

  61. titleLabel = nil,     — 标题

  62. subtitleLabel = nil   — 子标题

  63. }


  64. — 下个动作


  65. function


    Helper.nextAction()


  66. Helper.index = Helper.index + 1 — 索引加1


  67. if


    Helper.index > table.getn(Helper.createFunctionTable) then


  68. Helper.index = 1

  69. end



  70. return


    Helper.newScene()


  71. end


  72. — 回退动作


  73. function


    Helper.backAction()


  74. Helper.index = Helper.index – 1


  75. if


    Helper.index == 0 then


  76. Helper.index = table.getn(Helper.createFunctionTable)

  77. end



  78. return


    Helper.newScene()


  79. end


  80. — 重新开始动作


  81. function


    Helper.restartAction()



  82. return


    Helper.newScene()


  83. end


  84. — 切换新的场景


  85. function


    Helper.newScene()


  86. local scene

  87. — 如果使用物理效果


  88. if


    Helper.usePhysics then


  89. — 创建一个带物理效果的场景

  90. scene = cc.Scene:createWithPhysics()


  91. else




  92. scene = cc.Scene:create()

  93. end

  94. Helper.currentLayer = Helper.createFunctionTable[Helper.index]()

  95. — 添加当前层

  96. scene:addChild(Helper.currentLayer)

  97. — 添加返回菜单

  98. scene:addChild(CreateBackMenuItem())


  99. — 切换场景

  100. cc.Director:getInstance():replaceScene(scene)

  101. end


  102. — 初始化层


  103. function


    Helper.initWithLayer(layer)


  104. Helper.currentLayer = layer


  105. — 获取屏幕大小

  106. local size = cc.Director:getInstance():getWinSize()

  107. Helper.titleLabel = cc.Label:createWithTTF(

    “”


    , s_arialPath, 28)


  108. Helper.titleLabel:setAnchorPoint(cc.p(0.5, 0.5))

  109. layer:addChild(Helper.titleLabel, 1)

  110. Helper.titleLabel:setPosition(size.width / 2, size.height – 50)


  111. Helper.subtitleLabel = cc.Label:createWithTTF(

    “”


    , s_thonburiPath, 16)


  112. Helper.subtitleLabel:setAnchorPoint(cc.p(0.5, 0.5))

  113. layer:addChild(Helper.subtitleLabel, 1)

  114. Helper.subtitleLabel:setPosition(size.width / 2, size.height – 80)


  115. — menu菜单

  116. local item1 = cc.MenuItemImage:create(s_pPathB1, s_pPathB2)

  117. local item2 = cc.MenuItemImage:create(s_pPathR1, s_pPathR2)

  118. local item3 = cc.MenuItemImage:create(s_pPathF1, s_pPathF2)

  119. item1:registerScriptTapHandler(Helper.backAction)

  120. item2:registerScriptTapHandler(Helper.restartAction)

  121. item3:registerScriptTapHandler(Helper.nextAction)


  122. local menu = cc.Menu:create()

  123. menu:addChild(item1)

  124. menu:addChild(item2)

  125. menu:addChild(item3)

  126. menu:setPosition(cc.p(0, 0))

  127. — 摆放三个菜单项的位置

  128. item1:setPosition(cc.p(size.width / 2 – item2:getContentSize().width * 2, item2:getContentSize().height / 2))

  129. item2:setPosition(cc.p(size.width / 2, item2:getContentSize().height / 2))

  130. item3:setPosition(cc.p(size.width / 2 + item2:getContentSize().width * 2, item2:getContentSize().height / 2))

  131. layer:addChild(menu, 1)


  132. local background = cc.Layer:create()

  133. layer:addChild(background, -10)

  134. end


  135. — 创建测试层


  136. function


    createTestLayer(title, subtitle)


  137. — 创建一个层

  138. local layer = cc.Layer:create()

  139. Helper.initWithLayer(layer)

  140. local titleStr = title == nil and

    “No title”


    or title


  141. local subTitleStr = subtitle  == nil and

    “”


    or subtitle


  142. Helper.titleLabel:setString(titleStr)

  143. Helper.subtitleLabel:setString(subTitleStr)


  144. return


    layer


  145. 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. — tilemaps resource

  35. s_TilesPng            =

    “TileMaps/tiles.png”




  36. s_LevelMapTga         =

    “TileMaps/levelmap.tga”





  37. — spine test resource

  38. s_pPathSpineBoyJson       =

    “spine/spineboy.json”




  39. s_pPathSpineBoyAtlas       =

    “spine/spineboy.atlas”





  40. — fonts resource

  41. s_markerFeltFontPath   =

    “fonts/Marker Felt.ttf”




  42. s_arialPath            =

    “fonts/arial.ttf”




  43. s_thonburiPath         =

    “fonts/Thonburi.ttf”




  44. s_tahomaPath           =

    “fonts/tahoma.ttf”