cocos2dx-3.0(28) 动作类 Action

转自:http://blog.csdn.net/ac_huang/article/details/37972017


~~~~我的生活,我的点点滴滴!!


我们简单看看Action的继承树状图:


动作类(Action)是所有动作的基类,它创建的一个对象代表一个动作。动作作用于Node,因此每个动作都需要由Node对象执行。动作类(Action)作为基类,实际上是一个接口,动作类的大多数实现类都派生于有限时间动作类(FiniteTimeAction)。

但是在实际开发中我们通常用到两类动作-即时动作和持续动作,它们均继承于有限时间动作类。


一、即时动作

即时动作是能够立刻完成的动作,这类动作是在下一帧立刻完成的动作,如设定位置、设定缩放等。把它们包装成动作后,可以与其他动作类组合为复杂动作。


下面介绍一些常用即时动作


1、Place

该动作用于将节点放置到某个指定位置,其作用与修改节点的position属性相同。例如,将节点放到屏幕坐标(50,200)处的代码如下:

  1. //在Point(50,200)处放一个node
  2. autoplaceAction=Place::create(Point(50,200));
  3. autosprite_1=Sprite::create("role1.png");
  4. //先添加
  5. this->addChild(sprite_1);
  6. //类似于setPosition功能
  7. sprite_1->runAction(placeAction);

相当于把这个精灵放到 (50,200)处。


2、FlipX和FlipY

这两个动作分别用于将精灵沿X轴和Y轴反向显示,其作用与设置精灵的FlipX和FlipY属性相同,将其封装成动作接口是为了便于与其他动作进行组合。

下面代码将一个精灵移动到一端后反向显示再进行移回的动作:


3、Show和Hide

这两个动作分别用于显示和隐藏节点,其作用与设置节点的visible属性作用一样。例如:为了使精灵完成移动后隐藏起来。

代码如下:


4、CallFunc与CallFuncN

在cocos2dx 3.x版本后CallFunc系列动作只包括CallFunc、CallFuncN两个动作,CallFuncN需要添加一个node节点作为参数,传递给调用函数,他们都是用来在动作中进行方法调用,如在游戏中为了节约内存资源,

我们可以在动作完成后调用相应函数清理内存等一系列操作。

在2.x版本中的CallFuncND 和 CallFuncO 都可以通过 CallFunc 和 CallFuncN 进行实现。

4.1CallFunc


看完声明后,我们看看几种CallFunc使用的不同写法


4.2 CallFuncN


注意到该回调动作带有一个Node*参数。

假设回调函数:


受益于C++11的新语法特性 std::bind ; CallFuncND 和 CallFuncO 都可以通过 CallFunc 和 CallFuncN 进行实现。

4.3、CallFuncND

回调动作中带有一个Node*参数和一个void*参数。

实现过程类似于 CallFuncN

假设回调函数是 :

void HelloWorld::doRemoveFromParentAndCleanup(Node* sender,bool cleanup);

那么在回调动作中:

CallFuncN::create( CC_CALLBACK_1(HelloWorld::doRemoveFromParentAndCleanup,this,true));

这样就实现了等价于 CallFuncND 的回调动作。


4.4、CallFuncO

回调动作中带有一个Object*参数。

实现过程类似于 CallFunc

假设回调函数是: void HelloWorld::callback(Node* node,bool cleanup);

那么在回调动作中:

_grossini 为那个object对象

CallFunc::create( CC_CALLBACK_0(HelloWorld::callback,_grossini,true)

这样就实现了等价于 CallFuncO 的回调动作。


二、持续动作

属性变化动作:属性变化动作通过属性值的逐渐变化来实现动画效果。需要注意的是XXTo和XXBy的区别在于XXTo是表示最终值,而XXBy则表示向量-改变值。

1、MoveTo和MoveBy


用于使节点做直线运动,设置了动作时间和终点位置,在规定时间内会移动到终点,它们的初始化方法如下:
  1. //移动到Position的地方
  2. MoveTo::create(floatduration,constPoint&position);
  3. //移动的改变值为Position
  4. MoveBy::create(constPoint&position);

很多时候他两的效果相似。


2、JumpTo和JumpBy


使节点以一定的轨迹跳跃到指定位置,JumpTo 是跳到Position位置,JumpBy 是跳起一段距离改变值为Position。

先看看他们声明:
看下面的代码:

3、BezierTo和BezierBy


使节点进行曲线运动,运动的轨迹由贝塞尔曲线描述。
每条贝塞尔曲线都包含一个起点和一个终点。在一条曲线中,起点和终点各自包含一个控制点,而控制点到端点的连线称作控制线。
控制点决定了曲线的形状,包含角度和长度两个参数。
如下图:

使用时,我们要先创建ccBezierConfig结构体,设置好终点endPosition以及两个两个控制点controlPoint_1和controlPoint_2后,再把结构体传入BezierTo或BezierBy的初始化方法中:

4、ScaleTo和ScaleBy


产生缩放效果,使节点的缩放系数随时间线性变化,对应初始化方法为:

产生旋转效果,对应初始化方法为:
下面这些类用来实现某些特定的视觉效果

1、FadeIn,FadeOut和FateTo

产生淡入淡出效果,和透明变化效果,对应的初始化方法为:

2、TintTo和TintBy


设置色调(着色)变化,这个动作较少使用,初始化方法为:
样例:
copy
//着色
  • autotintTo=TintTo::create(2.0f,100,30);

  • 3、Blink


    使节点闪烁,其初始化方法为:

    样例:
    copy
    //使其闪烁,2s内让闪烁10次
  • autoblink=Blink::create(2.0f,10);

  • 4、Animation


    以帧动画形式实现动画效果,以下代码用两种方法实现精灵帧动画效果
    第一种:
    copy
    //创建一个空精灵
  • autosprite_9=Sprite::create();
  • sprite_9->setPosition(Point(160,320));
  • this->addChild(sprite_9);
  • //创建一个空的动画
  • autoanimation=Animation::create();
  • charszName[50];
  • for(inti=1;i<=18;++i)
  • {
  • memset(szName,153); background-color:inherit; font-weight:bold">sizeof(szName));
  • sprintf(szName,"role%d.png",i);
  • animation->addSpriteFrameWithFile(szName);
  • }
  • //18个精灵3s播完
  • animation->setDelayPerUnit(3.0/18);
  • //设置播放完保存原始图片
  • animation->setRestoreOriginalFrame(true);
  • //注意这里是使用Animate,前面是Animation
  • autoanimationAction=Animate::create(animation);
  • //播放一遍后就会消失
  • sprite_9->runAction(Sequence::create(animationAction,animationAction->reverse(),NULL));

  • 第二种使用plist文件

    动画创建后需要一个动画播放器来播放这些动画,这个播放器就是Animate

    四、复合动作

    通常在开发中我们需要将各种动作组合起来再让节点执行,复合动作的作用就是将各种动作组合在一起。而且,复合动作本身也是动作。因此可以作为一个普通动作嵌入到其他动作中。
    特别注意:Sequence动作不能嵌入其他复合动作内使用,DelayTime不属于复合动作,但是只能在复合动作内使用。

    1、DelayTime

    延时动作其实什么都不做,提供一段空白期,它只有一个初始化方法:
    copy
    DelayTime::create(floatd);
    d表示需要延时的时间。

    2、Repeat/RepeatForever

    反复执行某个动作,通常我们用Repeat和RepeatForever这两个方法执行:
    copy
    //循环次数
  • Repeat::create(FiniteTimeAction*action,unsignedinttimes);
  • //无限循环
  • RepeatForever::create(ActionInterval*action);
  • copy
    autorep=RepeatForever::create(Sequence::create(animationAction,NULL));
  • sprite_9->runAction(rep);

  • 3、Spawn


    使一批动作同时执行,他的两个初始化方法: copy
    Spawn::create(FiniteTimeAction*action1,...);
  • Spawn::create(constVector<FiniteTimeAction*>&arrayOfActions);
  • 看参数大概就知道是什么样子的了,这里就不给出样例代码了

    4、Sequence

    让各种动作有序执行,以下为它的两个初始化方法: copy
    Sequence::create(FiniteTimeAction*action1,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> Sequence::create(constVector<FiniteTimeAction*>&arrayOfActions);
    上面使用他无数次了,往前回顾

    五、变速动作

    变速动作和复合动作类似,也是一种特殊的动作,它可以把任何动作按照改变后的速度执行。

    1、Speed


    用于线性的改变某个动作的速度,为了改变一个动作的速度,首先需要将目标动作包装到Speed动作中:
    copy
    autorepeat=RepeatForever::create(animation);
  • autospeed=Speed::create(repeat,0.5f);
  • sprite->run(speed);
  • 第二个参数为变速比例,设置为0.5f则速度为原来一半。


    2、ActionEase


    Speed虽然能改变动作的速度,但是只能按比例改变速度,ActionEase可以实现动作的速度由快到慢、速度随时间改变的匀速运动。
    该类包含5类运动:
    指数缓冲;
    Sine缓冲;
    弹性缓冲;
    跳跃缓冲;
    回震缓冲;
    每类运动都包含3个不同时期的变换:In、Out和InOut。
    由于这个实在太多了,我就只举一个例子
    InSine例子:
    copy
    autosineIn=EaseSineIn::create(action);
  • sprite->runAction(sineIn);


  • 到此就总结的差不多了,如果后续还有,继续补充~~~~~~

    相关文章

        本文实践自 RayWenderlich、Ali Hafizji 的文章《...
    Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
    第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
        Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
    1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
       Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...