《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 --]]
浙公网安备 33010602011771号