首页 > 其他 > 详细

cocos2d-x动画加速与减速

时间:2015-09-29 17:04:14      阅读:122      评论:0      收藏:0      [点我收藏+]


原文http://blog.csdn.net/henren555/article/details/24244021
原作者:扬名天吓

动画是游戏的必然要素之一,在整个游戏过程中,又有着加速、减速动画的需求。以塔防为例子,布塔的时候希望能够将游戏减速,布好塔后,则希 望能将游戏加速;当某个怪被冰冻后,移动速度减缓,而其他怪的移动速度不变。cocos2d-x引擎为我们提供了很强大的接口,下面就将我实验的过程复述 一遍,也方便他人。
1)实现全局的加速、减速。
    通过设置Scheduler的timeScale,可以实现全局的加、减速。代码非常简单:
   

 CCScheduler* pScheduler = CCDirector::sharedDirector()->getScheduler();

    pScheduler->setTimeScale(2.0f); //实现加速效果

    pScheduler->setTimeScale(0.5f);//实现减速效果


2)实现对某个CCActionInterval动作的加速、减速
   方法一:很容易想到的一个方法就是改变CCAnimation的delay unit。代码如下:
     

  CCAnimation* pAnimation = CCAnimationCache::sharedAnimationCache()->animationByName(“xxx”);

       pAnimation->setDelayUnit(pAnimation->getDelayUnit()*0.2f); //速度为原来的5倍

       这个方法有一个缺点:改变了CCAnimationCache中这个animation的delay unit。也就是说以后即使再从CCAnimationCache中获取这个animation,其delay unit已经是原来的0.2倍了。


   方法二:cocos2d-x提供了CCSpeed的类,可以实现动画速度的调节。用法如下:
    

   CCActionInterval* pActionInterval = CCMoveTo::create(5.0f, ccp(500.0f, 100.0f));

       CCSpeed* pSpeed= CCSpeed::create(pActionInterval, 1.5f); //1.5倍速运行

       CCSpeed* pSpeed1 = CCSpeed::create(pActionInterval, 0.2f);// 0.2倍速运行

       pSprite->runAction(pSpeed);


       注意,如果pSprite有已经运行的动作,要用pSprite->stopActionByTag()停掉之前的动作,不然两个动作就叠加到一起了。

—————————————————————–华丽丽的分割线————————————————————————–

来自HIMI的提示:

很多时候你的主角的动作利用CCAction来实现,移动则是在update刷帧函 数或者一些选择器的方法中进行的,那么为了让你的主角慢动作比较逼真,那么Himi建议不要使用scheduleUpdate函数,因为这个你无法修改每 次调用update的时间默认都是每帧都调用,那么你应该自己定义一个选择器当刷逻辑的函数,这样就能配合CCSpeed实现逼真慢动作拉~
3)对某个CCFiniteTimeAction类型动作的加速、减速
大部分时候,一个游戏人物的动作并非由单一一个CCActionInterval类型的动作构成,而是一串动作连起来,构成一个Sequence。 用CCSequence::create(…)创建的对象都是CCFinteTimeAction类型的,CCSpeed并不适用。在CCSpeed类的 说明里,明确指 出”This action can’t be Sequenceable because it is not an CCIntervalAction”。 那对于Sequence就束手无策了吗?非也。cocos2d-x引擎自带例子中,schedulerTest给我们展示了如何控制某个sprite的 scheduler的timescale。废话少说,直接看代码。

在class TwoSchedulers中定义了两个customer的scheduler和两个CCActionManager。

CCScheduler *sched1;

 CCScheduler *sched2;

 CCActionManager *actionManager1;

 CCActionManager *actionManager2;

在onEnter函数中,分别对两个sprite设置customer的ActionManager.

 CCScheduler *defaultScheduler = CCDirector::sharedDirector()->getScheduler();

 // Create a new scheduler, and link it to the main scheduler

 sched1 = new CCScheduler();

 defaultScheduler->scheduleUpdateForTarget(sched1, 0, false);

 // Create a new ActionManager, and link it to the new scheudler

 actionManager1 = new CCActionManager();

 sched1->scheduleUpdateForTarget(actionManager1, 0, false);

 // Replace the default ActionManager with the new one.

 pSprite1->setActionManager(actionManager1);


通过以上的代码,就可以通过改变sched1的timescale来改变pSprite1的动作的快慢了。有了这种方法,那么就可以放弃CCSpeed的那种方法了。

欢迎关注关东升新浪微博@tony_关东升。
关注智捷课堂微信公共平台,了解最新技术文章、图书、教程信息
 技术分享更多精品iOS、Cocos、移动设计课程请关注智捷课堂官方网站:http://www.zhijieketang.com
智捷课堂论坛网站:http://51work6.com/forum.php


cocos2d-x动画加速与减速

原文:http://my.oschina.net/u/1410370/blog/512338

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!