首页 > 其他分享 >cocos2d-x动画加速与减速(转)

cocos2d-x动画加速与减速(转)

时间:2022-09-28 14:05:59浏览次数:70  
标签:动画 动作 CCSpeed 减速 CCScheduler cocos2d new


动画是游戏的必然要素之一,在整个游戏过程中,又有着加速、减速动画的需求。以塔防为例子,布塔的时候希望能够将游戏减速,布好塔后,则希望能将游戏加速;当某个怪被冰冻后,移动速度减缓,而其他怪的移动速度不变。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的那种方法了。


标签:动画,动作,CCSpeed,减速,CCScheduler,cocos2d,new
From: https://blog.51cto.com/u_13760719/5719211

相关文章

  • 简单的css动画---老式电影加载效果
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="viewport"c......
  • WPF学习 - 动画基础
    1.WPF中的动画(Animation),是一种属性动画。技术上来说,它是让属性从一个值,变化到另一个值的过程。因此,有两条条重要的特性:1.1只能为依赖属性应用动画 1.2动画只......
  • 封装加载动画组件,利用slot标签与vuex实现
     实现效果: 加载时:  加载完成时;   实现代码:通过vuex传入一个布尔值loading控制加载动画显示与否,动画关闭时,通过slot标签显示本组件中包含的其他内容组......
  • 一些最流行的 CSS 文本动画
    一些最流行的CSS文本动画让我们向您展示这些流行的CSS文本动画是如何工作的什么是动画?动画是一种按顺序创建动作的方法。什么是CSS动画?CSS动画用于动画从一种......
  • 一些最流行的 CSS 文本动画
    一些最流行的CSS文本动画让我们向您展示这些流行的CSS文本动画是如何工作的什么是动画?动画是一种按顺序创建动作的方法。什么是CSS动画?CSS动画用于动画从一种......
  • uniapp学习笔记-transition过渡动画切换卡顿的问题
    //主页分页面1分页面2 发现从主页跳转到1和2页面不存在动画卡顿,不过1和2之间切换存在卡顿,猜测可能是动画都是zoomin个人探索的解决方法:先切换到......
  • VUE:引入腾讯地图并实现轨迹动画
    腾讯位置服务JavaScriptAPI效果:引入步骤:在html中通过引入script标签加载API服务在一个盒子元素div中预先准备地图容器,并在CSS样式中定义地图(容器)显示大小......
  • CSS3动画
    简介CSSanimations使得可以将从一个CSS样式配置转换到另一个CSS样式配置。动画包括两个部分:描述动画的样式规则和用于指定动画开始、结束以及中间点样式的关键帧。......
  • 仅使用 CSS 和 HTML 制作动画加载屏幕
    仅使用CSS和HTML制作动画加载屏幕关于如何仅使用CSS和HTML开发动画加载屏幕的教程编写一个简单的加载屏幕很容易。但是编写一个可以移动的动画加载屏幕确实具有......
  • 排序算法动画演示
    本文由简悦SimpRead转码,原文地址blog.csdn.net一、直接插入排序(StraightInsertionSorting)把新的数据插入到已经排好的数据列中。将第一个数和第二个数排序,......