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

 在cocos2d-x中,有类型非常丰富的缓动供我们调用,实现方法也很简单,只需要将普通的Action当参数传入相对应的缓动发放就行,特殊一点的缓动会要求提供切换的速度和精度。

缓动可以理解为对普通Action的进一步封装。

下面是代码:(比较简单,浏览一遍就差不多啦)

  1 -- 缓动最大用处是应用在设计的运动表现上,他可以结合物理,数学等原理真实地模拟显示生活中的运动现象。
  2 -- 缓动的实现需要复杂的数学公式,在cocos2d-x中,都已经把实现过程封装好了。提供一些方法给我们用,很容易就能实现
  3 local kTagAction1 = 1
  4 local kTagAction2 = 2
  5 local kTagSlider = 1
  6 --[[
  7     缓动测试,缓动其实就是仿真运动,相对于普通的运动,更逼真,更具有表现力
  8     开篇布局:将所有小测试都用得到的变量和方法声明好
  9     本测试场景,需要用到的Sprite,Sprite的初始位置等,都是一样的
 10     所以干脆创建一个基础层getBaseLayer(),里面摆放这些所有小测试都用得到
 11     然后,每个小test开始之前,直接调用getBaseLayer()创建层,然后各自定义不同的缓动路径和方式
 12 ]]--
 13 
 14 local s = cc.Director:getInstance():getWinSize()
 15 local scheduler = cc.Director:getInstance():getScheduler()
 16 
 17 local function createSimpleMoveBy()
 18     return cc.MoveBy:create(3, cc.p(s.width - 130, 0))
 19 end
 20 
 21 --缓动中需要用到的 延时
 22 local function createSimpleDelayTime()
 23     return cc.DelayTime:create(0.25)
 24 end
 25 
 26 local function positionForTwo()
 27     grossini:setPosition(cc.p(60, s.height * 1 / 5))
 28     tamara:setPosition(cc.p(60, s.height * 4 / 5))
 29     kathia:setVisible(false)
 30 end
 31 
 32 --基础层
 33 local function getBaseLayer()
 34     local layer = cc.Layer:create()
 35     --这样声明~!!
 36     grossini = cc.Sprite:create(s_pPathGrossini)
 37     tamara = cc.Sprite:create(s_pPathSister1)
 38     kathia = cc.Sprite:create(s_pPathSister2)
 39 
 40     layer:addChild(grossini, 3)
 41     layer:addChild(kathia, 2)
 42     layer:addChild(tamara, 1)
 43 
 44     grossini:setPosition(cc.p(60, s.height * 1 / 5))
 45     kathia:setPosition(cc.p(60, s.height * 2.5 / 5))
 46     tamara:setPosition(cc.p(60, s.height * 4 / 5))
 47     
 48     --Helper是一个表,initWithLayer()用来初始化界面菜单什么的,可以把Helper.lua打开了解一下
 49     Helper.initWithLayer(layer)
 50 
 51     return layer
 52 end
 53 -----------------------------------
 54 --  SpriteEase
 55 -----------------------------------
 56 --测试一
 57 local SpriteEase_entry = nil
 58 
 59 local function testStopAction(dt)
 60     --此函数是经过脚本调度器调用的,首先弃用脚本调度器,所以只会被执行一次
 61     scheduler:unscheduleScriptEntry(SpriteEase_entry)
 62     tamara:stopActionByTag(1)
 63     kathia:stopActionByTag(1)
 64     grossini:stopActionByTag(1)
 65 end
 66 
 67 local function SpriteEase_onEnterOrExit(tag)
 68     if tag == "enter" then
 69        --脚本调度器,启用,6.25秒之后调用testStopAction()
 70         SpriteEase_entry = scheduler:scheduleScriptFunc(testStopAction, 6.25, false)
 71     elseif tag == "exit" then
 72        --脚本调度器,弃用
 73         scheduler:unscheduleScriptEntry(SpriteEase_entry)
 74     end
 75 end
 76 
 77 local function SpriteEase()
 78     --布局
 79     local layer = getBaseLayer()
 80     --创建Action
 81     local move = createSimpleMoveBy()
 82     --对上面的Action,调用reverse(),表示此运动的逆运动
 83     local move_back = move:reverse()
 84 
 85     --创建缓动和其逆运动,--缓动是以基本Action为基础的
 86     local move_ease_in = cc.EaseIn:create(createSimpleMoveBy(), 2.5)
 87     local move_ease_in_back = move_ease_in:reverse()
 88 
 89     local move_ease_out = cc.EaseOut:create(createSimpleMoveBy(), 2.5)
 90     local move_ease_out_back = move_ease_out:reverse()
 91     
 92     --普通Action和缓动都可以拼成Sequence(序列)
 93     local delay = createSimpleDelayTime()
 94     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime())
 95     local seq2 = cc.Sequence:create(move_ease_in,createSimpleDelayTime(),move_ease_in_back,createSimpleDelayTime())
 96     local seq3 = cc.Sequence:create(move_ease_out,createSimpleDelayTime(),move_ease_out_back,createSimpleDelayTime())
 97     
 98     --runAction()让精灵动起来
 99     local a2 = grossini:runAction(cc.RepeatForever:create(seq1))
100     --精灵是用local声明的,所以用setTag()贴一个标签,这样的话在别的地方也可以用到
101     a2:setTag(1)
102     local a1 = tamara:runAction(cc.RepeatForever:create(seq2))
103     a1:setTag(1)
104     local a = kathia:runAction(cc.RepeatForever:create(seq3))
105     a:setTag(1)
106 
107     --看代码的入口:给层注册载入事件
108     layer:registerScriptHandler(SpriteEase_onEnterOrExit)
109 
110     Helper.titleLabel:setString("EaseIn - EaseOut - Stop")
111     return layer
112 end
113 -----------------------------------
114 --    SpriteEaseInOut
115 -----------------------------------
116 --测试二,基本同上,没新要点
117 local function SpriteEaseInOut()
118     --同上
119     local layer = getBaseLayer()
120 
121     local move = createSimpleMoveBy()
122 
123     local move_ease_inout1 = cc.EaseInOut:create(createSimpleMoveBy(), 0.65)
124     local move_ease_inout_back1 = move_ease_inout1:reverse()
125 
126     local move_ease_inout2 = cc.EaseInOut:create(createSimpleMoveBy(), 1.35)
127     local move_ease_inout_back2 = move_ease_inout2:reverse()
128 
129     local move_ease_inout3 = cc.EaseInOut:create(createSimpleMoveBy(), 1.0)
130     local move_ease_inout_back3 = move_ease_inout3:reverse()
131 
132     local delay = createSimpleDelayTime()
133     local seq1 = cc.Sequence:create(move_ease_inout1,delay,move_ease_inout_back1,createSimpleDelayTime())
134     local seq2 = cc.Sequence:create(move_ease_inout2,createSimpleDelayTime(),move_ease_inout_back2,createSimpleDelayTime())
135     local seq3 = cc.Sequence:create(move_ease_inout3, createSimpleDelayTime(), move_ease_inout_back3, createSimpleDelayTime() )
136 
137     tamara:runAction(cc.RepeatForever:create(seq1))
138     kathia:runAction(cc.RepeatForever:create(seq2))
139     grossini:runAction(cc.RepeatForever:create(seq3))
140 
141     Helper.titleLabel:setString("EaseInOut and rates")
142     return layer
143 end
144 -----------------------------------
145 --    SpriteEaseExponential
146 -----------------------------------
147 local function SpriteEaseExponential()
148     local layer = getBaseLayer()
149 
150     local move = createSimpleMoveBy()
151     local move_back = move:reverse()
152 
153     local move_ease_in = cc.EaseExponentialIn:create(createSimpleMoveBy())
154     local move_ease_in_back = move_ease_in:reverse()
155 
156     local move_ease_out = cc.EaseExponentialOut:create(createSimpleMoveBy())
157     local move_ease_out_back = move_ease_out:reverse()
158 
159     local delay = createSimpleDelayTime()
160     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime())
161     local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime())
162     local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime())
163 
164     grossini:runAction(cc.RepeatForever:create(seq1))
165     tamara:runAction(cc.RepeatForever:create(seq2))
166     kathia:runAction(cc.RepeatForever:create(seq3))
167 
168     Helper.titleLabel:setString("ExpIn - ExpOut actions")
169     return layer
170 end
171 -----------------------------------
172 --    SpriteEaseExponentialInOut
173 -----------------------------------
174 local function SpriteEaseExponentialInOut()
175     local layer = getBaseLayer()
176 
177     local move = createSimpleMoveBy()
178     local move_back = move:reverse()
179 
180     local move_ease = cc.EaseExponentialInOut:create(createSimpleMoveBy())
181     local move_ease_back = move_ease:reverse()
182 
183     local delay = createSimpleDelayTime()
184     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime())
185     local seq2 = cc.Sequence:create(move_ease, createSimpleDelayTime(), move_ease_back, createSimpleDelayTime() )
186 
187     positionForTwo()
188 
189     grossini:runAction(cc.RepeatForever:create(seq1))
190     tamara:runAction(cc.RepeatForever:create(seq2))
191 
192     Helper.titleLabel:setString("EaseExponentialInOut action")
193     return layer
194 end
195 -----------------------------------
196 --    SpriteEaseSine
197 -----------------------------------
198 local function SpriteEaseSine()
199     local layer = getBaseLayer()
200 
201     local move = createSimpleMoveBy()
202     local move_back = move:reverse()
203 
204     local move_ease_in = cc.EaseSineIn:create(createSimpleMoveBy())
205     local move_ease_in_back = move_ease_in:reverse()
206 
207     local move_ease_out = cc.EaseSineOut:create(createSimpleMoveBy())
208     local move_ease_out_back = move_ease_out:reverse()
209 
210     local delay = createSimpleDelayTime()
211     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime() )
212     local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime())
213     local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back,createSimpleDelayTime())
214 
215     grossini:runAction(cc.RepeatForever:create(seq1))
216     tamara:runAction(cc.RepeatForever:create(seq2))
217     kathia:runAction(cc.RepeatForever:create(seq3))
218 
219     Helper.titleLabel:setString("EaseSineIn - EaseSineOut")
220     return layer
221 end
222 -----------------------------------
223 --    SpriteEaseSineInOut
224 -----------------------------------
225 local function SpriteEaseSineInOut()
226     local layer = getBaseLayer()
227 
228     local move = createSimpleMoveBy()
229     local move_back = move:reverse()
230 
231     local move_ease = cc.EaseSineInOut:create(createSimpleMoveBy())
232     local move_ease_back = move_ease:reverse()
233 
234     local delay = createSimpleDelayTime()
235     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime())
236     local seq2 = cc.Sequence:create(move_ease, createSimpleDelayTime(), move_ease_back, createSimpleDelayTime())
237 
238     positionForTwo()
239 
240     grossini:runAction(cc.RepeatForever:create(seq1))
241     tamara:runAction(cc.RepeatForever:create(seq2))
242 
243     Helper.titleLabel:setString("EaseSineInOut action")
244     return layer
245 end
246 -----------------------------------
247 --    SpriteEaseElastic
248 -----------------------------------
249 local function SpriteEaseElastic()
250     local layer = getBaseLayer()
251 
252     local move = createSimpleMoveBy()
253     local move_back = move:reverse()
254 
255     local move_ease_in = cc.EaseElasticIn:create(createSimpleMoveBy())
256     local move_ease_in_back = move_ease_in:reverse()
257 
258     local move_ease_out = cc.EaseElasticOut:create(createSimpleMoveBy())
259     local move_ease_out_back = move_ease_out:reverse()
260 
261     local delay = createSimpleDelayTime()
262     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime() )
263     local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime())
264     local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime())
265 
266     grossini:runAction(cc.RepeatForever:create(seq1))
267     tamara:runAction(cc.RepeatForever:create(seq2))
268     kathia:runAction(cc.RepeatForever:create(seq3))
269 
270     Helper.titleLabel:setString("Elastic In - Out actions")
271     return layer
272 end
273 -----------------------------------
274 --    SpriteEaseElasticInOut
275 -----------------------------------
276 local function SpriteEaseElasticInOut()
277     local layer = getBaseLayer()
278 
279     local move = createSimpleMoveBy()
280 
281     local move_ease_inout1 = cc.EaseElasticInOut:create(createSimpleMoveBy(), 0.3)
282     local move_ease_inout_back1 = move_ease_inout1:reverse()
283 
284     local move_ease_inout2 = cc.EaseElasticInOut:create(createSimpleMoveBy(), 0.45)
285     local move_ease_inout_back2 = move_ease_inout2:reverse()
286 
287     local move_ease_inout3 = cc.EaseElasticInOut:create(createSimpleMoveBy(), 0.6)
288     local move_ease_inout_back3 = move_ease_inout3:reverse()
289 
290     local delay = createSimpleDelayTime()
291     local seq1 = cc.Sequence:create(move_ease_inout1, delay, move_ease_inout_back1, createSimpleDelayTime())
292     local seq2 = cc.Sequence:create(move_ease_inout2, createSimpleDelayTime(), move_ease_inout_back2, createSimpleDelayTime())
293     local seq3 = cc.Sequence:create(move_ease_inout3, createSimpleDelayTime(), move_ease_inout_back3, createSimpleDelayTime())
294 
295     tamara:runAction(cc.RepeatForever:create(seq1))
296     kathia:runAction(cc.RepeatForever:create(seq2))
297     grossini:runAction(cc.RepeatForever:create(seq3))
298 
299     Helper.titleLabel:setString("EaseElasticInOut action")
300     return layer
301 end
302 -----------------------------------
303 --    SpriteEaseBounce
304 -----------------------------------
305 local function SpriteEaseBounce()
306     local layer = getBaseLayer()
307 
308     local move = createSimpleMoveBy()
309     local move_back = move:reverse()
310 
311     local move_ease_in = cc.EaseBounceIn:create(createSimpleMoveBy())
312     local move_ease_in_back = move_ease_in:reverse()
313 
314     local move_ease_out = cc.EaseBounceOut:create(createSimpleMoveBy())
315     local move_ease_out_back = move_ease_out:reverse()
316 
317     local delay = createSimpleDelayTime()
318     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime() )
319     local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime())
320     local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime())
321 
322     grossini:runAction(cc.RepeatForever:create(seq1))
323     tamara:runAction(cc.RepeatForever:create(seq2))
324     kathia:runAction(cc.RepeatForever:create(seq3))
325 
326     Helper.titleLabel:setString("Bounce In - Out actions")
327     return layer
328 end
329 -----------------------------------
330 --    SpriteEaseBounceInOut
331 -----------------------------------
332 local function SpriteEaseBounceInOut()
333     local layer = getBaseLayer()
334 
335     local move = createSimpleMoveBy()
336     local move_back = move:reverse()
337 
338     local move_ease = cc.EaseBounceInOut:create(createSimpleMoveBy())
339     local move_ease_back = move_ease:reverse()
340 
341     local delay = createSimpleDelayTime()
342     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime())
343     local seq2 = cc.Sequence:create(move_ease, createSimpleDelayTime(), move_ease_back, createSimpleDelayTime())
344 
345     positionForTwo()
346 
347     grossini:runAction(cc.RepeatForever:create(seq1))
348     tamara:runAction(cc.RepeatForever:create(seq2))
349 
350     Helper.titleLabel:setString("EaseBounceInOut action")
351     return layer
352 end
353 -----------------------------------
354 --    SpriteEaseBack
355 -----------------------------------
356 local function SpriteEaseBack()
357     local layer = getBaseLayer()
358 
359     local move = createSimpleMoveBy()
360     local move_back = move:reverse()
361 
362     local move_ease_in = cc.EaseBackIn:create(createSimpleMoveBy())
363     local move_ease_in_back = move_ease_in:reverse()
364 
365     local move_ease_out = cc.EaseBackOut:create(createSimpleMoveBy())
366     local move_ease_out_back = move_ease_out:reverse()
367 
368     local delay = createSimpleDelayTime()
369     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime())
370     local seq2 = cc.Sequence:create(move_ease_in, createSimpleDelayTime(), move_ease_in_back, createSimpleDelayTime())
371     local seq3 = cc.Sequence:create(move_ease_out, createSimpleDelayTime(), move_ease_out_back, createSimpleDelayTime())
372 
373     grossini:runAction(cc.RepeatForever:create(seq1))
374     tamara:runAction(cc.RepeatForever:create(seq2))
375     kathia:runAction(cc.RepeatForever:create(seq3))
376 
377     Helper.titleLabel:setString("Back In - Out actions")
378     return layer
379 end
380 -----------------------------------
381 --    SpriteEaseBackInOut
382 -----------------------------------
383 local function SpriteEaseBackInOut()
384     local layer = getBaseLayer()
385 
386     local move = createSimpleMoveBy()
387     local move_back = move:reverse()
388 
389     local move_ease = cc.EaseBackInOut:create(createSimpleMoveBy())
390     local move_ease_back = move_ease:reverse()
391 
392     local delay = createSimpleDelayTime()
393     local seq1 = cc.Sequence:create(move, delay, move_back, createSimpleDelayTime())
394     local seq2 = cc.Sequence:create(move_ease,createSimpleDelayTime(), move_ease_back, createSimpleDelayTime())
395 
396     positionForTwo()
397 
398     grossini:runAction(cc.RepeatForever:create(seq1))
399     tamara:runAction(cc.RepeatForever:create(seq2))
400 
401     Helper.titleLabel:setString("EaseBackInOut action")
402     return layer
403 end
404 -----------------------------------
405 --    SpeedTest
406 -----------------------------------
407 local SpeedTest_entry = nil
408 local SpeedTest_action1 = nil
409 local SpeedTest_action2 = nil
410 local SpeedTest_action3 = nil
411 
412 local function altertime(dt)
413     SpeedTest_action1:setSpeed(math.random() * 2)
414     SpeedTest_action2:setSpeed(math.random() * 2)
415     SpeedTest_action3:setSpeed(math.random() * 2)
416 end
417 
418 local function SpeedTest_onEnterOrExit(tag)
419     if tag == "enter" then
420         SpeedTest_entry = scheduler:scheduleScriptFunc(altertime, 1.0, false)
421     elseif tag == "exit" then
422         scheduler:unscheduleScriptEntry(SpeedTest_entry)
423     end
424 end
425 
426 local function SpeedTest()
427     local layer = getBaseLayer()
428     --JumpBy的四个参数分别是:时间,目标坐标,高度,次数
429     local jump1 = cc.JumpBy:create(4, cc.p(- s.width + 80, 0), 100, 4)
430     local jump2 = jump1:reverse()
431     local rot1 = cc.RotateBy:create(4, 360 * 2)
432     local rot2 = rot1:reverse()
433 
434     local seq3_1 = cc.Sequence:create(jump2, jump1)
435     local seq3_2 = cc.Sequence:create(rot1, rot2)
436     
437     --新要点:Spawn里面所有的Action同时进行,不同于Sequence,Sequence是顺序进行
438     --还有,Sequence不能放到cc.Repeatforever:create()中
439     local spawn = cc.Spawn:create(seq3_1, seq3_2)
440     
441     --Speed接受一个Action或复合Action和一个数值,数值表示运动的速度,会忽略普通Action的时间
442     SpeedTest_action1 = cc.Speed:create(cc.RepeatForever:create(spawn), 10)
443     --SpeedTest_action1 = cc.Speed:create(jump1, 1)
444 
445     local spawn2 = spawn:clone()
446     SpeedTest_action2 = cc.Speed:create(cc.RepeatForever:create(spawn2), 1.0)
447 
448     local spawn3 = spawn:clone()
449     SpeedTest_action3 = cc.Speed:create(cc.RepeatForever:create(spawn3), 1.0)
450 
451    -- grossini:runAction(SpeedTest_action2)
452     tamara:runAction(SpeedTest_action3)
453     kathia:runAction(SpeedTest_action1)
454 
455     layer:registerScriptHandler(SpeedTest_onEnterOrExit)
456 
457     Helper.titleLabel:setString("Speed action")
458     return layer
459 end
460 
461 function EaseActionsTest()
462     local scene = cc.Scene:create()
463     cclog("EaseActionsTest")
464 
465     Helper.createFunctionTable = {
466         SpriteEase,
467         SpriteEaseInOut,
468         SpriteEaseExponential,
469         SpriteEaseExponentialInOut,
470         SpriteEaseSine,
471         SpriteEaseSineInOut,
472         SpriteEaseElastic,
473         SpriteEaseElasticInOut,
474         SpriteEaseBounce,    
475         SpriteEaseBounceInOut,    
476         SpriteEaseBack,    
477         SpriteEaseBackInOut,
478         SpeedTest
479     }
480     scene:addChild(SpriteEase())
481     scene:addChild(CreateBackMenuItem())
482     return scene
483 end
484 --[[
485     AtionsEaseTest比较有规律,现在从这里面总结几点:
486     1、对Action调用reverse()方法,可以得到其逆运动
487     2、创建缓动需要普通Action做参数,缓动是普通Action更逼真的一种表现形式
488     3、缓动有18种:cc.EaseIn:create()
489                 cc.EaseOut:create()
490                 cc.EaseInOut:create()
491                 cc.EaseExponentialin:create()
492                 cc.EaseExponentialOut:create()
493                 cc.EaseExponentialInOut:create()
494                 cc.EaseElasticInOut:create()
495                上面的七种,除了需要一个普通Action做参数,还需要一个数值表示突变的速度 
496                 cc.EaseSineIn:create()
497                 cc.EaseSineOut:create()
498                 cc.EaseSineInOut:create()
499                 cc.EaseElasticIn:create()
500                 cc.EaseElasticOut:create()
501                 cc.EaseBounceIn:create()
502                 cc.EaseBounceOut:create()
503                 cc.EaseBounceInOut:create()
504                 cc.EaseBackIn:create()
505                 cc.EaseBackOut:create()
506                 cc.EaseBackInOut:create()
507             上面的11种则只需要一个普通的Action做参数了
508             
509     4、缓动名称都很有规律,EaseXXXIn,EaseXXXOut,EaseXXXInOut,把中间的那个单词记住就够了
510     5、本例中还出现一个新复合运动:Spawn,可以接收多个普通Action和缓动,在不冲突的情况下,同时进行。
511 --]]

 

posted on 2014-08-11 18:06  _Ernest  阅读(1836)  评论(0)    收藏  举报

导航