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
- local kTagNode = 0 -- 结点标识
- local kTagGrossini = 1 --
- local kTagSequence = 2 --
- -- 获取和这个 director 关联的调度器
- local scheduler = cc.Director:getInstance():getScheduler()
- --------------------------------------------------------------------
- --
- -- Test1
- --
- --------------------------------------------------------------------
-
- local function CrashTest()
- -- 创建测试层
- local ret = createTestLayer("Test 1. Should not crash")
- -- 精灵,s_pPathGrossini为图片路径
- local child = cc.Sprite:create(s_pPathGrossini)
- -- 显示到x=200,y=200的位置
- child:setPosition( 200,200 )
- ret:addChild(child, 1)
-
- --Sum of all action's duration is 1.5 second.
- -- 旋转一个节点,1.5秒,旋转90度
- child:runAction(cc.RotateBy:create(1.5, 90))
- -- 执行动作序列,1.4秒延迟,淡出
- child:runAction(cc.Sequence:create(cc.DelayTime:create(1.4),cc.FadeOut:create(1.1)))
-
- local function removeThis()
- -- 溢出孩子
- ret:getParent():removeChild(ret, true)
- Helper.nextAction()
- end
-
- --After 1.5 second, self will be removed.
- -- 1.5秒之后,自身会被移除
- ret:runAction( cc.Sequence:create(cc.DelayTime:create(1.4),cc.CallFunc:create(removeThis)))
- return ret
- end
-
-
- --------------------------------------------------------------------
- --
- -- LogicTest
- -- 逻辑测试
- --------------------------------------------------------------------
- local function LogicTest()
- local ret = createTestLayer("Logic test")
- -- 精灵,s_pPathGrossini为图片路径
- local grossini = cc.Sprite:create(s_pPathGrossini)
- -- 添加一个子节点到容器中,有Z轴顺序和一个标记。
- ret:addChild(grossini, 0, 2)
- grossini:setPosition(200,200)
- local function bugMe(node)
- -- 停止所有动作
- node:stopAllActions() --After this stop next action not working, if remove this stop everything is working
- node:runAction(cc.ScaleTo:create(2, 2))
- end
- -- 运行动作序列
- grossini:runAction( cc.Sequence:create(cc.MoveBy:create(1, cc.p(150,0)) ,cc.CallFunc:create(bugMe)))
- return ret
- end
-
- --------------------------------------------------------------------
- --
- -- PauseTest
- -- 暂停测试
- --------------------------------------------------------------------
-
- local function PauseTest()
- local ret = createTestLayer("Pause Test")
- local schedulerEntry = nil
- local function unpause(dt)
- scheduler:unscheduleScriptEntry(schedulerEntry)
- schedulerEntry = nil
- local node = ret:getChildByTag( kTagGrossini )
- local pDirector = cc.Director:getInstance()
- pDirector:getActionManager():resumeTarget(node)
- end
-
- local function onNodeEvent(event)
- -- 进入时
- if event == "enter" then
- local s = cc.Director:getInstance():getWinSize()
- local l = cc.Label:createWithTTF("After 3 seconds grossini should move", "fonts/Thonburi.ttf", 16)
- ret:addChild(l)
- l:setAnchorPoint(cc.p(0.5, 0.5))
- l:setPosition( cc.p(s.width / 2, 245) )
-
- local grossini = cc.Sprite:create(s_pPathGrossini)
- ret:addChild(grossini, 0, kTagGrossini)
- grossini:setPosition(cc.p(200,200))
-
- -- 创建移动动作,持续时间1秒,移动到(150,0)的位置
- local action = cc.MoveBy:create(1, cc.p(150,0))
-
- local pDirector = cc.Director:getInstance()
- -- 通过获取director关联的ActionManager并为目标添加动作
- -- 为一个目标添加动作。 如果目标已经存在,动作将被加在已经存在的目标上。
- -- 如果目标不存在,将会创建这个目标的新对象,这个动作将被添加在这个新创建出来的对象上 当目标动作被暂停,动作队列的顺序也不会乱。
- pDirector:getActionManager():addAction(action, grossini, true)
-
- schedulerEntry = scheduler:scheduleScriptFunc(unpause, 3.0, false)
- -- 退出
- elseif event == "exit" then
- if schedulerEntry ~= nil then
- scheduler:unscheduleScriptEntry(schedulerEntry)
- end
- end
- end
- -- 注册响应事件
- ret:registerScriptHandler(onNodeEvent)
- return ret
- end
-
- --------------------------------------------------------------------
- --
- -- RemoveTest
- --
- --------------------------------------------------------------------
- local function RemoveTest()
- local ret = createTestLayer("Remove Test")
- local l = cc.Label:createWithTTF("Should not crash", "fonts/Thonburi.ttf", 16)
- -- 获得屏幕大小
- local s = cc.Director:getInstance():getWinSize()
- ret:addChild(l)
- l:setAnchorPoint(cc.p(0.5, 0.5))
- l:setPosition( cc.p(s.width / 2, 245))
-
- -- 创建移动动作,持续2秒,到(200,0)的位置
- local pMove = cc.MoveBy:create(2, cc.p(200, 0))
- -- 停止动作
- local function stopAction()
- -- 根据Tag来获取子节点
- local pSprite = ret:getChildByTag(kTagGros
|
请发表评论