【cocos2d-x】动作类之缓冲动作和组合动作的使用(变速动作)

时间:2023-02-08 16:41:18

一、缓冲动作


        在实现运动中,常常需要一些加速度或者减速度的效果。Cocos2D-X引擎为我们提供了相应的实现接口,这样就不用再用原来的公式计算方法来实现加减速的效果。
     Ease系列的方法改变了运动的速度,但是并没有改变总体时间。如果整个动作持续5s,那么整个时间仍然会持续 5s。这些动作可以分为三类。


<1> In actions:action(开始的时候加速)

<2> Out actions:action(结束的时候加速)

<3> InOut actions:action(开始和结束的时候加速)


CCActionEase有很多子类,根据不同的缓冲公式来模拟加减速过程。缓冲动作的具体内容如下。


<1> 指数缓冲:分别为EaseExponentialIn、EaseExponentialOut、EaseExponentialInOut。


速度时间坐标图如下图所示。

【cocos2d-x】动作类之缓冲动作和组合动作的使用(变速动作)

<2> 赛因缓冲:分别为EaseSineIn、EaseSineOut、EaseSineInOut。速度时间坐标图如下图所示。

【cocos2d-x】动作类之缓冲动作和组合动作的使用(变速动作)

<3> 跳跃缓冲:分别为EaseBounceIn、EaseBounceOut、EaseBounceInOut。速度时间坐标图如下图所示。

【cocos2d-x】动作类之缓冲动作和组合动作的使用(变速动作)

<4> 弹性缓冲:分别为EaseElasticIn、EaseElasticOut、EaseElasticInOut。速度时间坐标图如下图所示

【cocos2d-x】动作类之缓冲动作和组合动作的使用(变速动作)

<5> 回震缓冲:分别为EaseBackIn、EaseBackOut、EaseBackInOut。速度时间坐标图如下图所示。

【cocos2d-x】动作类之缓冲动作和组合动作的使用(变速动作)
以上介绍了5种缓冲动作,加上基本的缓冲动作,一共是6种缓冲动作,

//基本缓冲动作
CCEaseIn::create((CCActionInterval*)(move->copy()->autorelease()), 2.5f);
CCEaseOut::create((CCActionInterval*)(move->copy()->autorelease()), 2.5f);
CCEaseInOut::create((CCActionInterval*)(move->copy()->autorelease()), 0.65f);

//-----指数缓冲动作--------

//缓慢开始
CCEaseExponentialIn::create((CCActionInterval*)(move->copy()->autorelease()));
//缓慢终止
CCEaseExponentialOut::create((CCActionInterval*)(move->copy()->autorelease()));
CCEaseExponentialInOut::create((CCActionInterval*)(move->copy()->autorelease()));

//-----赛因缓冲动作---------

//由慢至快
CCEaseSineIn::create((CCActionInterval*)(move->copy()->autorelease()));
//由快至慢
CCEaseSineOut::create((CCActionInterval*)(move->copy()->autorelease()));
//由慢至快再至慢
CCEaseSineInOut::create((CCActionInterval*)(move->copy()->autorelease()));

//------跳跃缓冲动作--------

//在起始位置开始反弹
CCEaseBounceIn::create((CCActionInterval*)(move->copy()->autorelease()));
//在结束位置开始反弹
CCEaseBounceOut::create((CCActionInterval*)(move->copy()->autorelease()));
//在起始位置和结束位置都反弹
CCEaseBounceInOut::create((CCActionInterval*)(move->copy()->autorelease()));

//------弹性缓冲动作--------

//在起点位置赋予弹性
CCEaseElasticIn::create((CCActionInterval*)(move->copy()->autorelease()));
//在终点位置赋予弹性
CCEaseElasticOut::create((CCActionInterval*)(move->copy()->autorelease()));
//在起点和终点位置都赋予弹性
CCEaseElasticInOut::create((CCActionInterval*)(move->copy()->autorelease()), 0.3f);

//------回震缓冲动作---------

//在起点位置作为回力点
CCEaseBackIn::create((CCActionInterval*)(move->copy()->autorelease()));
//在终点位置作为回力点
CCEaseBackOut::create((CCActionInterval*)(move->copy()->autorelease()));
//在起点和终点位置都作为回力点
CCEaseBackInOut::create((CCActionInterval*)(move->copy()->autorelease()));

二、组合动作

  在游戏中,游戏对象有时不是执行一个动作,有时是多个动作的动作序列,有时是同时执行几个动作序列。这时候就需要使用组合动作的方式将多个动作或按序列组织,或合成在一起。首先介绍CCSequence动作序列。

1、CCSequence

定义一个动作序列,可以使用动作的CCArray数组;也可以把所有的动作作为参数传入create函数中,最后结尾参数使用NULL(空值)即可;还可以把两个有限时间动作按顺序传入create函数中。

  <1> CCSequence的方法

CCSequence::create(CCFiniteTimeAction * pAction1,...)

  作用:让多个动作按照前后顺序逐一执行。

  参数:目标动作的可变参数。

  扩展:如需要对一个序列中的所有动作全部进行反向运动,可以使用如下形式操作。 
  CCFiniteTimeAction * seq = CCSequence::create(moveBy,scaleBy,...,NULL);
  CCFiniteTimeAction * reverseSeq = CCSequence::create(seq,seq->reverse(),...,NULL);

注意:CCSequence中的所有动作都必须支持reverse()函数,否则会出现异常!

2、CCSpawn

    CCSpawn动作是使被合成的动作同时进行。它的定义方法和动作序列一致。

<1> CCSpawn的用法

  
CCSpawn::create(CCFiniteTimeAction * pAction1,...)

    作用:让多个动作按照前后顺序逐一执行。

    参数:目标动作的可变参数。


3、CCRepeat和CCRepeatForever

     除了以上两个可以实现多个动作的类外,还有可以使一个动作重复播放的类,那就是CCRepeat和CCRepeatForever。二者都可以使动作重复进行,不同之处就是CCRepeat可以在第二个参数中定义重复次数,而CCRepeatForever是一直重复的。

<1> CCRepeat的用法

CCRepeat::create(CCFiniteTimeAction * pAction1,unsigned int times)

作用:对目标动作进行重复运动(目标动作可以是CCSequence、CCSpawn)。

参数1:目标动作。

参数2:重复次数。


<2> CCRepeatForever的用法

CCRepeatForever::create(CCActionInterval* pAction)

作用:对目标动作进行永久性的重复运动(目标动作可以是CCSequence、CCSpawn)。

参数:目标动作



PS:使用:

例如: 让一个精灵 执行组合的 指数缓冲动作
//创建精灵
CCSprite *sprite= CCSprite::create("Icon.png");
sprite->setPosition(ccp(100, 300));
this->addChild(sprite,0);
// 创建一个动作
CCActionInterval* move = CCMoveBy::create(3, CCPointMake(size.width,0));
// 根据这个动作创建指数缓冲动作
CCActionInterval* move_ease_in = CCEaseExponentialIn::create((CCActionInterval*)(move->copy()->autorelease()));
 // 反向动作
CCActionInterval* move_ease_in_back = move_ease_in->reverse(); 
// 创建动作序列 
CCSequence* seq2 = CCSequence::create( move_ease_in, move_ease_in_back, NULL);
sprite->runAction( CCRepeatForever::create(seq2));

原文链接: http://m.blog.csdn.net/blog/yangyu20121224/9851437