动画加减速

来源:互联网 发布:中国十大网络作家 编辑:程序博客网 时间:2024/05/17 03:24

变速动作和复合动作类似,也是一种特殊的动作,它可以把任何动作按照改变后的速度执行。变速动作与复合动作最大的区别就是复合动作只是单纯的组合一系列动作,而变速的做在组合一系列动作后还要去改变动作的执行速度。

变速动作主要分为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中去,如果有哪位知道指点下





原创粉丝点击