《Cocos2d-x-3.2 Lua-tests》文件详解 之 缓动ActionsEase
2014-08-11 18:06
387 查看
在cocos2d-x中,有类型非常丰富的缓动供我们调用,实现方法也很简单,只需要将普通的Action当参数传入相对应的缓动发放就行,特殊一点的缓动会要求提供切换的速度和精度。
缓动可以理解为对普通Action的进一步封装。
下面是代码:(比较简单,浏览一遍就差不多啦)
缓动可以理解为对普通Action的进一步封装。
下面是代码:(比较简单,浏览一遍就差不多啦)
-- 缓动最大用处是应用在设计的运动表现上,他可以结合物理,数学等原理真实地模拟显示生活中的运动现象。 -- 缓动的实现需要复杂的数学公式,在cocos2d-x中,都已经把实现过程封装好了。提供一些方法给我们用,很容易就能实现 local kTagAction1 = 1 local kTagAction2 = 2 local kTagSlider = 1 --[[ 缓动测试,缓动其实就是仿真运动,相对于普通的运动,更逼真,更具有表现力 开篇布局:将所有小测试都用得到的变量和方法声明好 本测试场景,需要用到的Sprite,Sprite的初始位置等,都是一样的 所以干脆创建一个基础层getBaseLayer(),里面摆放这些所有小测试都用得到 然后,每个小test开始之前,直接调用getBaseLayer()创建层,然后各自定义不同的缓动路径和方式 ]]-- local s = cc.Director:getInstance():getWinSize() local scheduler = cc.Director:getInstance():getScheduler() local function createSimpleMoveBy() return cc.MoveBy:create(3, cc.p(s.width - 130, 0)) end --缓动中需要用到的 延时 local function createSimpleDelayTime() return cc.DelayTime:create(0.25) end local function positionForTwo() grossini:setPosition(cc.p(60, s.height * 1 / 5)) tamara:setPosition(cc.p(60, s.height * 4 / 5)) kathia:setVisible(false) end --基础层 local function getBaseLayer() local layer = cc.Layer:create() --这样声明~!! grossini = cc.Sprite:create(s_pPathGrossini) tamara = cc.Sprite:create(s_pPathSister1) kathia = cc.Sprite:create(s_pPathSister2) layer:addChild(grossini, 3) layer:addChild(kathia, 2) layer:addChild(tamara, 1) grossini:setPosition(cc.p(60, s.height * 1 / 5)) kathia:setPosition(cc.p(60, s.height * 2.5 / 5)) tamara:setPosition(cc.p(60, s.height * 4 / 5)) --Helper是一个表,initWithLayer()用来初始化界面菜单什么的,可以把Helper.lua打开了解一下 Helper.initWithLayer(layer) return layer end ----------------------------------- -- SpriteEase ----------------------------------- --测试一 local SpriteEase_entry = nil local function testStopAction(dt) --此函数是经过脚本调度器调用的,首先弃用脚本调度器,所以只会被执行一次 scheduler:unscheduleScriptEntry(SpriteEase_entry) tamara:stopActionByTag(1) kathia:stopActionByTag(1) grossini:stopActionByTag(1) end local function SpriteEase_onEnterOrExit(tag) if tag == "enter" then --脚本调度器,启用,6.25秒之后调用testStopAction() SpriteEase_entry = scheduler:scheduleScriptFunc(testStopAction, 6.25, false) elseif tag == "exit" then --脚本调度器,弃用 scheduler:unscheduleScriptEntry(SpriteEase_entry) end end local function SpriteEase() --布局 local layer = getBaseLayer() --创建Action local move = createSimpleMoveBy() --对上面的Action,调用reverse(),表示此运动的逆运动 local move_back = move:reverse() --创建缓动和其逆运动,--缓动是以基本Action为基础的 local move_ease_in = cc.EaseIn:create(createSimpleMoveBy(), 2.5) local move_ease_in_back = move_ease_in:reverse() local move_ease_out = cc.EaseOut:create(createSimpleMoveBy(), 2.5) local move_ease_out_back = move_ease_out:reverse() --普通Action和缓动都可以拼成Sequence(序列) local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease_in,createSimpleDelayTime(),move_ease_in_back,createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_out,createSimpleDelayTime(),move_ease_out_back,createSimpleDelayTime()) --runAction()让精灵动起来 local a2 = grossini:runAction(cc.RepeatForever:create(seq1)) --精灵是用local声明的,所以用setTag()贴一个标签,这样的话在别的地方也可以用到 a2:setTag(1) local a1 = tamara:runAction(cc.RepeatForever:create(seq2)) a1:setTag(1) local a = kathia:runAction(cc.RepeatForever:create(seq3)) a:setTag(1) --看代码的入口:给层注册载入事件 layer:registerScriptHandler(SpriteEase_onEnterOrExit) Helper.titleLabel:setString("EaseIn - EaseOut - Stop") return layer end ----------------------------------- -- SpriteEaseInOut ----------------------------------- --测试二,基本同上,没新要点 local function SpriteEaseInOut() --同上 local layer = getBaseLayer() local move = createSimpleMoveBy() local move_ease_inout1 = cc.EaseInOut:create(createSimpleMoveBy(), 0.65) local move_ease_inout_back1 = move_ease_inout1:reverse() local move_ease_inout2 = cc.EaseInOut:create(createSimpleMoveBy(), 1.35) local move_ease_inout_back2 = move_ease_inout2:reverse() local move_ease_inout3 = cc.EaseInOut:create(createSimpleMoveBy(), 1.0) local move_ease_inout_back3 = move_ease_inout3:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move_ease_inout1,delay,move_ease_inout_back1,createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease_inout2,createSimpleDelayTime(),move_ease_inout_back2,createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_inout3, createSimpleDelayTime(), move_ease_inout_back3, createSimpleDelayTime() ) tamara:runAction(cc.RepeatForever:create(seq1)) kathia:runAction(cc.RepeatForever:create(seq2)) grossini:runAction(cc.RepeatForever:create(seq3)) Helper.titleLabel:setString("EaseInOut and rates") return layer end ----------------------------------- -- SpriteEaseExponential ----------------------------------- local function SpriteEaseExponential() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease_in = cc.EaseExponentialIn:create(createSimpleMoveBy()) local move_ease_in_back = move_ease_in:reverse() local move_ease_out = cc.EaseExponentialOut:create(createSimpleMoveBy()) local move_ease_out_back = move_ease_out:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime()) grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) kathia:runAction(cc.RepeatForever:create(seq3)) Helper.titleLabel:setString("ExpIn - ExpOut actions") return layer end ----------------------------------- -- SpriteEaseExponentialInOut ----------------------------------- local function SpriteEaseExponentialInOut() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease = cc.EaseExponentialInOut:create(createSimpleMoveBy()) local move_ease_back = move_ease:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease, createSimpleDelayTime(), move_ease_back, createSimpleDelayTime() ) positionForTwo() grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) Helper.titleLabel:setString("EaseExponentialInOut action") return layer end ----------------------------------- -- SpriteEaseSine ----------------------------------- local function SpriteEaseSine() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease_in = cc.EaseSineIn:create(createSimpleMoveBy()) local move_ease_in_back = move_ease_in:reverse() local move_ease_out = cc.EaseSineOut:create(createSimpleMoveBy()) local move_ease_out_back = move_ease_out:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime() ) local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back,createSimpleDelayTime()) grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) kathia:runAction(cc.RepeatForever:create(seq3)) Helper.titleLabel:setString("EaseSineIn - EaseSineOut") return layer end ----------------------------------- -- SpriteEaseSineInOut ----------------------------------- local function SpriteEaseSineInOut() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease = cc.EaseSineInOut:create(createSimpleMoveBy()) local move_ease_back = move_ease:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease, createSimpleDelayTime(), move_ease_back, createSimpleDelayTime()) positionForTwo() grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) Helper.titleLabel:setString("EaseSineInOut action") return layer end ----------------------------------- -- SpriteEaseElastic ----------------------------------- local function SpriteEaseElastic() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease_in = cc.EaseElasticIn:create(createSimpleMoveBy()) local move_ease_in_back = move_ease_in:reverse() local move_ease_out = cc.EaseElasticOut:create(createSimpleMoveBy()) local move_ease_out_back = move_ease_out:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime() ) local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime()) grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) kathia:runAction(cc.RepeatForever:create(seq3)) Helper.titleLabel:setString("Elastic In - Out actions") return layer end ----------------------------------- -- SpriteEaseElasticInOut ----------------------------------- local function SpriteEaseElasticInOut() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_ease_inout1 = cc.EaseElasticInOut:create(createSimpleMoveBy(), 0.3) local move_ease_inout_back1 = move_ease_inout1:reverse() local move_ease_inout2 = cc.EaseElasticInOut:create(createSimpleMoveBy(), 0.45) local move_ease_inout_back2 = move_ease_inout2:reverse() local move_ease_inout3 = cc.EaseElasticInOut:create(createSimpleMoveBy(), 0.6) local move_ease_inout_back3 = move_ease_inout3:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move_ease_inout1, delay, move_ease_inout_back1, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease_inout2, createSimpleDelayTime(), move_ease_inout_back2, createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_inout3, createSimpleDelayTime(), move_ease_inout_back3, createSimpleDelayTime()) tamara:runAction(cc.RepeatForever:create(seq1)) kathia:runAction(cc.RepeatForever:create(seq2)) grossini:runAction(cc.RepeatForever:create(seq3)) Helper.titleLabel:setString("EaseElasticInOut action") return layer end ----------------------------------- -- SpriteEaseBounce ----------------------------------- local function SpriteEaseBounce() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease_in = cc.EaseBounceIn:create(createSimpleMoveBy()) local move_ease_in_back = move_ease_in:reverse() local move_ease_out = cc.EaseBounceOut:create(createSimpleMoveBy()) local move_ease_out_back = move_ease_out:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime() ) local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime()) grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) kathia:runAction(cc.RepeatForever:create(seq3)) Helper.titleLabel:setString("Bounce In - Out actions") return layer end ----------------------------------- -- SpriteEaseBounceInOut ----------------------------------- local function SpriteEaseBounceInOut() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease = cc.EaseBounceInOut:create(createSimpleMoveBy()) local move_ease_back = move_ease:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease, createSimpleDelayTime(), move_ease_back, createSimpleDelayTime()) positionForTwo() grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) Helper.titleLabel:setString("EaseBounceInOut action") return layer end ----------------------------------- -- SpriteEaseBack ----------------------------------- local function SpriteEaseBack() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease_in = cc.EaseBackIn:create(createSimpleMoveBy()) local move_ease_in_back = move_ease_in:reverse() local move_ease_out = cc.EaseBackOut:create(createSimpleMoveBy()) local move_ease_out_back = move_ease_out:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime()) local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime()) grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) kathia:runAction(cc.RepeatForever:create(seq3)) Helper.titleLabel:setString("Back In - Out actions") return layer end ----------------------------------- -- SpriteEaseBackInOut ----------------------------------- local function SpriteEaseBackInOut() local layer = getBaseLayer() local move = createSimpleMoveBy() local move_back = move:reverse() local move_ease = cc.EaseBackInOut:create(createSimpleMoveBy()) local move_ease_back = move_ease:reverse() local delay = createSimpleDelayTime() local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime()) local seq2 = cc.Sequence:create(move_ease,createSimpleDelayTime(), move_ease_back, createSimpleDelayTime()) positionForTwo() grossini:runAction(cc.RepeatForever:create(seq1)) tamara:runAction(cc.RepeatForever:create(seq2)) Helper.titleLabel:setString("EaseBackInOut action") return layer end ----------------------------------- -- SpeedTest ----------------------------------- local SpeedTest_entry = nil local SpeedTest_action1 = nil local SpeedTest_action2 = nil local SpeedTest_action3 = nil local function altertime(dt) SpeedTest_action1:setSpeed(math.random() * 2) SpeedTest_action2:setSpeed(math.random() * 2) SpeedTest_action3:setSpeed(math.random() * 2) end local function SpeedTest_onEnterOrExit(tag) if tag == "enter" then SpeedTest_entry = scheduler:scheduleScriptFunc(altertime, 1.0, false) elseif tag == "exit" then scheduler:unscheduleScriptEntry(SpeedTest_entry) end end local function SpeedTest() local layer = getBaseLayer() --JumpBy的四个参数分别是:时间,目标坐标,高度,次数 local jump1 = cc.JumpBy:create(4, cc.p(- s.width + 80, 0), 100, 4) local jump2 = jump1:reverse() local rot1 = cc.RotateBy:create(4, 360 * 2) local rot2 = rot1:reverse() local seq3_1 = cc.Sequence:create(jump2, jump1) local seq3_2 = cc.Sequence:create(rot1, rot2) --新要点:Spawn里面所有的Action同时进行,不同于Sequence,Sequence是顺序进行 --还有,Sequence不能放到cc.Repeatforever:create()中 local spawn = cc.Spawn:create(seq3_1, seq3_2) --Speed接受一个Action或复合Action和一个数值,数值表示运动的速度,会忽略普通Action的时间 SpeedTest_action1 = cc.Speed:create(cc.RepeatForever:create(spawn), 10) --SpeedTest_action1 = cc.Speed:create(jump1, 1) local spawn2 = spawn:clone() SpeedTest_action2 = cc.Speed:create(cc.RepeatForever:create(spawn2), 1.0) local spawn3 = spawn:clone() SpeedTest_action3 = cc.Speed:create(cc.RepeatForever:create(spawn3), 1.0) -- grossini:runAction(SpeedTest_action2) tamara:runAction(SpeedTest_action3) kathia:runAction(SpeedTest_action1) layer:registerScriptHandler(SpeedTest_onEnterOrExit) Helper.titleLabel:setString("Speed action") return layer end function EaseActionsTest() local scene = cc.Scene:create() cclog("EaseActionsTest") Helper.createFunctionTable = { SpriteEase, SpriteEaseInOut, SpriteEaseExponential, SpriteEaseExponentialInOut, SpriteEaseSine, SpriteEaseSineInOut, SpriteEaseElastic, SpriteEaseElasticInOut, SpriteEaseBounce, SpriteEaseBounceInOut, SpriteEaseBack, SpriteEaseBackInOut, SpeedTest } scene:addChild(SpriteEase()) scene:addChild(CreateBackMenuItem()) return scene end --[[ AtionsEaseTest比较有规律,现在从这里面总结几点: 1、对Action调用reverse()方法,可以得到其逆运动 2、创建缓动需要普通Action做参数,缓动是普通Action更逼真的一种表现形式 3、缓动有18种:cc.EaseIn:create() cc.EaseOut:create() cc.EaseInOut:create() cc.EaseExponentialin:create() cc.EaseExponentialOut:create() cc.EaseExponentialInOut:create() cc.EaseElasticInOut:create() 上面的七种,除了需要一个普通Action做参数,还需要一个数值表示突变的速度 cc.EaseSineIn:create() cc.EaseSineOut:create() cc.EaseSineInOut:create() cc.EaseElasticIn:create() cc.EaseElasticOut:create() cc.EaseBounceIn:create() cc.EaseBounceOut:create() cc.EaseBounceInOut:create() cc.EaseBackIn:create() cc.EaseBackOut:create() cc.EaseBackInOut:create() 上面的11种则只需要一个普通的Action做参数了 4、缓动名称都很有规律,EaseXXXIn,EaseXXXOut,EaseXXXInOut,把中间的那个单词记住就够了 5、本例中还出现一个新复合运动:Spawn,可以接收多个普通Action和缓动,在不冲突的情况下,同时进行。 --]]
相关文章推荐
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 进度条ActionsProgress
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 特效Effects
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 动作管理ActionManager
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 截屏CaptreScreen
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 动作Actions
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 视差Parallax
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 基本绘图DrawPrimitives
- 《Cocos2d-x-3.2 Lua-tests》文件详解 之 加速器
- [quick-cocos2d-x lua学习] 源文件编译、加密详解、及自更新文章收集
- cocos2d-x 3.2中lua文件生成luac文件
- [QuickX]xcode运行Quick-cocos2d-x项目时自动更新lua资源文件
- ios:UIView动画总结[转]IPhone中UIView中动画及其属性说明[转]详解UIScrollView[转]以及cocos2d框架简介[转]Automator重命名文件介绍[转]
- Cocos2d-x 3.2 Lua示例 ClickAndMoveTest(点击移动测试)
- Cocos2d-x 3.1.1 lua-tests 开篇
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
- Cocos2d-x Lua 读取Csv文件,更方便的使用数据
- Cocos2d-x 3.2 Lua示例 AssetsManagerTest(资源管理器)
- cocos2d 3.2的一个简单lua demo
- cocos2d-x的lua脚本如何加载Cocostudio制作的UI文件
- lua cocos2d-x lua中每次Build都不更新Resource下面的文件,怎样使xcode每次Build都更新Resource下的lua文件