菜鸟学习Cocos2d-x 3.x——浅谈动作Action
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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);