您的位置:首页 > 移动开发 > Cocos引擎

《Cocos2d-x-3.2 Lua-tests》文件详解 之 缓动ActionsEase

2014-08-11 18:06 387 查看
在cocos2d-x中,有类型非常丰富的缓动供我们调用,实现方法也很简单,只需要将普通的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和缓动,在不冲突的情况下,同时进行。
--]]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: