動畫加減速

變速動作和複合動作類似,也是一種特殊的動作,它可以把任何動作按照改變後的速度執行。變速動作與複合動作最大的區別就是複合動作只是單純的組合一系列動作,而變速的做在組合一系列動作後還要去改變動作的執行速度。

變速動作主要分爲2大類:Speed和ActionEase

 

一.Speed

用於線性地改變某個動作的速度,也就是說成倍數的改變某動作的整體速度。Speed相當於一個包裝器,將需要改變速度的動作包裝到其中。

Speed類源碼可以在CCAction類中看到:

[cpp] view plain copy
  1. class CC_DLL Speed : public Action  
  2. {  
  3.     ......  
  4.     static Speed* create(ActionInterval* action, float speed);  
  5.     inline float getSpeed(voidconst { return _speed; }  
  6.     inline void setSpeed(float speed) { _speed = speed; }  
  7.     ......  
  8. }  

可以看到,Speed類是直接繼承自Action類的。其create()方法接收2個參數,第一個是其要包裝的動作,必須是ActionInterval類型的動作,即簡單的持續動作或複合動作,不可以是即時動作;第二個參數是一個float類型的速度值speed,這個speed就是該方法要包裝的動作原來執行速度的倍數,比如speed=0.5,代表包裝後速度變爲原來的0.5倍,speed=2,代表包裝後速度是原來速度的2倍。


舉個栗子:

[cpp] view plain copy
  1. //創建一個sprite  
  2. auto sprite = Sprite::create("haha.jpg");  
  3.   
  4. //添加  
  5. this->addChild(sprite);  
  6.   
  7. //創建MoveTo動作  
  8. auto _moveTo = MoveTo::create(3.0,Vec2(920,320));  
  9.   
  10. //創建Speed變速動作  
  11. //參數:1.動作 2.所包裝動作原來速度的倍數  
  12. auto _speed = Speed::create(_moveTo,2);  
  13.   
  14. //執行動作  
  15. sprite->runAction(_speed);  


二.ActionEase

Speed雖然能改變動作的速度,但只能按比例改變速度。ActionEase可以實現動作的速度由快到慢、速度隨時間改變的運動。該類包含好多種類的緩衝運動:指數緩衝、正弦緩衝、彈性緩衝、跳躍緩衝和回震緩衝等等。每類緩衝運動基本都包含3個不同時期的變換:In、Out和InOut,這3個變換有是什麼呢?簡單來說,In是在運動起始時加速,Out是在運動快結束時減速,InOut包含兩者,就是先加速後減速

 

我們可以先看一下ActionEase類的源碼

[cpp] view plain copy
  1. class CC_DLL ActionEase : public ActionInterval  

這句聲明可以看到,ActionEase類是繼承自ActionInterval類,所以它也是一種持續動作


下面是所有種類緩衝運動的聲明:

[cpp] view plain copy
  1. //指數緩衝  
  2. class CC_DLL EaseExponentialIn : public ActionEase  
  3. class CC_DLL EaseExponentialOut : public ActionEase  
  4. class CC_DLL EaseExponentialInOut : public ActionEase  
  5.    
  6. //正弦緩衝  
  7. class CC_DLL EaseSineIn : public ActionEase  
  8. class CC_DLL EaseSineOut : public ActionEase  
  9. class CC_DLL EaseSineInOut : public ActionEase  
  10.    
  11. //彈性緩衝  
  12. class CC_DLL EaseElastic : public ActionEase  
  13. class CC_DLL EaseElasticIn : public EaseElastic  
  14. class CC_DLL EaseElasticOut : public EaseElastic  
  15. class CC_DLL EaseElasticInOut : public EaseElastic  
  16.    
  17. //跳躍緩衝  
  18. class CC_DLL EaseBounce : public ActionEase  
  19. class CC_DLL EaseBounceIn : public EaseBounce  
  20. class CC_DLL EaseBounceOut : public EaseBounce  
  21. class CC_DLL EaseBounceInOut : public EaseBounce  
  22.    
  23. //回震緩衝  
  24. class CC_DLL EaseBackIn : public ActionEase  
  25. class CC_DLL EaseBackOut : public ActionEase  
  26. class CC_DLL EaseBackInOut : public ActionEase  
  27.    
  28. //貝塞爾緩衝  
  29. class CC_DLL EaseBezierAction : public ActionEase  
  30.   
  31. //二次緩衝  
  32. class CC_DLL EaseQuadraticActionIn : public ActionEase  
  33. class CC_DLL EaseQuadraticActionOut : public ActionEase  
  34. class CC_DLL EaseQuadraticActionInOut : public ActionEase  
  35.   
  36. //四次緩衝  
  37. class CC_DLL EaseQuarticActionIn : public ActionEase  
  38. class CC_DLL EaseQuarticActionOut : public ActionEase  
  39. class CC_DLL EaseQuarticActionInOut : public ActionEase  
  40.   
  41. //五次緩衝  
  42. class CC_DLL EaseQuinticActionIn : public ActionEase  
  43. class CC_DLL EaseQuinticActionOut : public ActionEase  
  44. class CC_DLL EaseQuinticActionInOut : public ActionEase  
  45.   
  46. //循環緩衝  
  47. class CC_DLL EaseCircleActionIn : public ActionEase  
  48. class CC_DLL EaseCircleActionOut : public ActionEase  
  49. class CC_DLL EaseCircleActionInOut:public ActionEase  
  50.   
  51. //立方緩衝  
  52. class CC_DLL EaseCubicActionIn:public ActionEase  
  53. class CC_DLL EaseCubicActionOut : public ActionEase  
  54. class CC_DLL EaseCubicActionInOut : public ActionEase  
  55.    

可以看出,ActionEase類提供了的各種緩衝方式的子類,每一種緩衝方式(貝塞爾緩衝除外)基本都分爲In、Out和InOut三種不同時期的變換。

 

下面來舉個使用ActionEase的栗子:

[cpp] view plain copy
  1. //創建一個sprite  
  2. auto sprite = Sprite::create("haha.jpg");  
  3.   
  4. //添加  
  5. this->addChild(sprite);  
  6.   
  7. //創建MoveTo動作  
  8. auto _moveTo = MoveTo::create(3.0,Vec2(920,320));  
  9.   
  10. //創建正弦緩衝動作  
  11. auto _sineEase = EaseSineInOut::create(_moveTo);  
  12.   
  13. //執行動作  
  14. sprite->runAction(_sineEase);  

其他緩衝類型的動作的使用方法也都與上面的例子一樣,只是函數名不同。覺得這麼多種類的運動方式還真看不出來太大的區別

-------以下個人

這是存在問題的,有可能把速度減到爲負速,即跑過頭在往回跑

自己玩了下,貌似speed的動作加不到Sequence中去,如果有哪位知道指點下





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章