菜鸟学习Cocos2d-x 3.x——浅谈动作Action

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

菜鸟学习Cocos2d-x 3.x——浅谈动作Action

动作类概述

一款游戏,设计的再NB的游戏,如果都是一堆静态的图片,没有任何动作,那也只能“呵呵”了。动作体系对于一款游戏的成功与否,有着非常重要的影响。所以,这篇文章就对Cocos2d-x中的动作进行总结。先来看看Cocos2d-x中的与动作相关的类。

与动作相关的类图如下图所示:现在就对这些类进行简单的介绍,在后续的小节中还会进行详细的分析的。

∙Ref和Clonable:这里不说,在总结Cocos2d-x内存管理的时候再进行详细总结;

∙Action:所有动作的父类,定义了公共的操作;

∙FiniteTimeAction:瞬时动作和延时动作的父类,可以定义动作的时间变化;

∙Follow:跟随节点的动作;

∙Speed:改变一个动作的时间,比如实现慢动作回放或者快进;

∙ActionInstant:瞬间完成动作,中间没有任何动画效果;

∙ActionInterval:动作会在指定的时间内完成,中间会有动画效果;

∙FlipX:X轴方向翻转;

∙MoveTo:移动动作;

∙……

下面就对上面说的这些类进行通过实际的代码进行总结。

Action类的主要成员函数

以下是Action类的主要成员函数:

/**

* 返回一个新的Action对象,表示原动作的相反的动作

*/

virtual Action* reverse()const=0;

// 如果动作已经完成了,就返回true

virtualbool isDone()const;

// 在动作开始之前被调用,设置动作作用的对象

virtualvoid startWithTarget(Node*target);

/**

* 在动作完成以后会被调用,它会设置"target"对象为空

* 注:请永远不要手动调用该函数,而是调用对应的"target->stopAction(a ction);"

*/

virtualvoid stop();

/**

* 每帧都会调用的方法,如果你需要在每帧控制动作,则需要重写,时间间隔为动作间隔时间

* 最好不要重写该函数,除非你真的知道怎么做

*/

virtualvoid step(float dt);

/**

* 每一帧都会调用一次该函数,参数time取值为0和1之间的任意值,例如:

* 0表示动作刚刚开始的时候调用;

* 0.5表示动作执行到一半的时候调用;

* 1表示动作完成以后调用;

*/

virtualvoid update(float time);

// 获得执行动作的对象

inline Node*getTarget()const{return _target;}

// 设置执行动作的对象

inlinevoid setTarget(Node*target){ _target = target;}

// 动作标签

inlineint getTag()const{return _tag;}

inlinevoid setTag(int tag){ _tag = tag;}

瞬时动作

ActionInstant是瞬时动作类。瞬时动作表示瞬间完成动作,中间没有任何动画效果;由于ActionInstant的子类那么多,这里就以FlipX为例子,做一个简单的Demo。效果如下图所示:

可以看到小狗走到最左边时,会有一个转向的过程,这就是FlipX的动作效果。示例代码如下:

Size visibleSize=Director::getInstance()->getVisibleSize();

// 创建移动动作

ActionInterval*moveto=MoveTo::create(5,Vec2(0,200));

// 创建X轴方向的翻转动作

ActionInstant*flipx=FlipX::create(true);

ActionInterval*moveback=MoveTo::create(5,Vec2(visibleSize.widt h,200));

auto scene =Director::getInstance()->getRunningScene();

auto layer = scene->getChildByTag(1);

auto dog = layer->getChildByTag(1);

// flipx->reverse()获得对应的逆向动作

auto action =Sequence::create(moveto,flipx,moveback,flipx->reve rse(), NULL);

dog->runAction(action);

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

延时动作

动作会在指定的时间内完成,中间会有动画效果。延时动作通过属性值的逐渐变化来实现动画效果。需要注意的是XXTo和XXBy的区别在于XXTo是表示最终值,而XXBy则表示向量-改变值。比如MoveTo和MoveBy动作,如以下效果所示:

示例代码如下:

// 创建移动动作

ActionInterval*moveto=MoveTo::create(5,Vec2(0,200)); ActionInterval*moveby=MoveBy::create(5,Vec2(-200,0));

auto scene =Director::getInstance()->getRunningScene();

auto layer = scene->getChildByTag(1);

相关文档
最新文档