cocos2D-x 3.x学习笔记【四】 动作效果

时间:2022-04-08 12:10:38

很坑爹又很幸运的,cocos2D-x v3.x 版本的动作效果类,虽然改了名字,参数却修改不多。大部分的动画类只是把名字前的CC去掉了,使用方式还是一样。

当然,原来的CC动作类依旧可以使用,但是编译器会报已经废弃的警告。

开始试试常用动作类的效果,比如移动、缩放、延时、旋转、回调等等。

这些类称为动作类,与动画区分,因为这些类不是一帧帧播放图像的动画,更像是在控制着一个动画的动作。

本博文基于以下环境:

Cocos2D-x v3.2
vc++ 2012
win7
=============================正文开始=====================================

Action 的继承关系:

cocos2D-x 3.x学习笔记【四】 动作效果

这是从官方文档中取来的一张Action 类的继承图表,是不是觉得很庞大,不过我们有规律可循。

Action:所有动作类的父类。

FiniteTimeAction:所有在限时间能够完成的动作(action)的基类,就是说,动作是有时间限制的,一定有执行完的时候。ActionInterval类和ActionInstant类都属于有限时间动作。

ActionInterval:区间动作,即动作有一定变化时间。
ActionInstant:瞬时动作,即动作不需要给定时间而是立刻完成。

RepeatForever:无限循环动作。
Follow:一种“跟随”某一个节点的动作.
Speed:改变一个action的运行速度, 使他持续更长时间 (speed>1)或者更短的时间(speed<1).

明白了上面这几个基础的动作类,那么看看其他动作类与之继承的关系,也就举一反三了。

一、移动 MoveBy 和 MoveTo

看继承树里,移动相关的函数有两个,区别是 moveby是相对于原来位置的移动,而moveto是绝对位置的移动。

意思是,moveby移动的位置等于 原来的位置+传参值,moveto直接以左下角为原点,移动到新坐标处。

代码:

	auto sp = Sprite::create("YellowSquare.png"); <span style="white-space:pre">	</span>//新建一个sprite
sp->setAnchorPoint( Vec2(0.5f , 0.5f));<span style="white-space:pre"> </span>//设置锚点为中心
sp->setPosition(origin+Vec2(visible.width/2 , visible.height/2));<span style="white-space:pre"> </span>//设置坐标为屏幕中心
this->addChild(sp);

MoveBy* moveby = MoveBy::create( 1.0f , Vec2(150,0));<span style="white-space:pre"> </span>//新建一个moveby对象,运动时间为 1.0秒,移动效果为 x+150,y+0。
sp->runAction(moveby);<span style="white-space:pre"> </span>//sprite 使用动作

第一个参数是 动作时间,第二参数是vec2类型对象,传入x,y。

上面的代码运行起来,sprite 会向右移动 150个像素位。
将最后两行注释掉,换上下面代码:

<span style="white-space:pre">	</span>MoveTo* moveto = MoveTo::create( 1.0f ,Vec2(150,0));
sp->runAction(moveto);
看起来并没有太大改变,运行起来,sprite向左下滑动到了坐标(150,0)的位置。

二、旋转 RotateTo 和 RotateBy

两个类极其之相似,第二个类比第一个多了一个3D方法,依据cocos2D-x取名字的尿性,to的意思为直接旋转到某角度(可能旋转,也可能已经转到指定角度而不再旋转),by是在原角度上继续旋转传入角度。

<pre name="code" class="cpp">	RotateBy* rotateby = RotateBy::create( 2.0f , 100);
RotateTo* rotateto = RotateTo::create( 2.0f , 100);
Sequence* se = Sequence::create(rotateto,rotateby,nullptr); //连续播放以上两个动作,这是动作序列类,后面说到。

sp->runAction(se);

 

第一个参数都是 动作时间,后面参数有1~2个,分别为整体旋转、2D旋转和3D旋转。3D旋转为RotateBy类为独有,传入Vec3对象,可查官方文档。

旋转角度,正值为顺时针旋转,负值为逆时针旋转。

可以在sequence类中 ,把两个类的对象顺序变动一下看看不同。

三、缩放 ScaleBy 和 ScaleTo

照例,to是缩放到指定的大小,by是在原有的比例上继续进行缩放。

<pre name="code" class="cpp">	ScaleBy* scaleby = ScaleBy::create( 2.0f , 0.5f , 2.0f );
ScaleTo* scaleto = ScaleTo::create(2.0f , 0.5f , 2.0f);
Sequence* se = Sequence::create(scaleto,scaleby,nullptr);
sp->runAction(se);

参数第一个依旧是时间,后面参数有1~3个,分别是整体缩放、2D缩放、3D缩放。可以在sequence类中 ,把两个类的对象顺序变动一下看看不同。 

四、跳跃 JumpBy 和 JumpTo

	//JumpTo* action = JumpTo::create(5.0f,Vec2(500,0),100,4);
JumpBy* action = JumpBy::create(5.0f,Vec2(500,0),100,4);
sp->runAction(action);
第一个参数为时间,第二个是坐标点,By是在原坐标上的增量,而to是直接跳到指定坐标,第三个参数是跳跃高度,最后一个是跳跃次数。
切换注释可以看到效果。


五、透明度变化 FadeIn / FadeOut / FadeTo

	//FadeIn* action = FadeIn::create(2.0f);
//FadeOut* action = FadeOut::create(2.0f);
FadeTo* action = FadeTo::create(2.0f,180);
sp->runAction(action);
FadeIn:在指定时间内将对象透明度提升至255。

FadeOut :在指定时间内将对象透明度减小到0,即隐去。
FadeTo:在指定时间内将透明度调至指定值。


基本的动作效果已经列出来的,其他的还有闪烁、贝塞尔曲线等等,可自行查询官方文档

可是只有基本动作是不够用的,也许需要先移动后缩放,也许要一边移动一边播放,又或许移动了等几秒再继续缩放。

这里就要用到把各个不同动作组合起来的 动作组合类。


一、播放序列 Sequence

	MoveBy* moveby = MoveBy::create( 1.0f , Vec2(150,0));
RotateTo* rotateto = RotateTo::create( 2.0f , 100);
Sequence* se = Sequence::create(rotateto,moveby,nullptr);
sp->runAction(se);

Sequence类:创建的时候,将不同的action对象传入,参数以nullptr结束,总时间为各个动作时间之和。


二、并播动作 Spawn

	ScaleTo* scaleto = ScaleTo::create(2.0f , 0.5f , 2.0f);
MoveBy* moveby = MoveBy::create( 1.0f , Vec2(150,0));
Spawn* spawn = Spawn::create(moveby,scaleto,nullptr);
sp->runAction(spawn);
Spawn类:将不同的动作一起播放出来,参数以nullptr结束,总时间为 各个动作中时间最长的那个。

三、延时 DelayTime

	MoveBy* moveby = MoveBy::create( 1.0f , Vec2(150,0));
RotateTo* rotateto = RotateTo::create( 2.0f , 100);
DelayTime* delaytime = DelayTime::create( 2.0f );
Sequence* se = Sequence::create(rotateto,delaytime,moveby,nullptr);

sp->runAction(se);
将延时插入 Sequence序列中,后一个动作将被延迟播放。

四、重复播放 Repeat 和 RepeatForever

	MoveBy* moveby = MoveBy::create( 1.0f , Vec2(150,0));<span style="white-space:pre">		</span>// 右移 150
MoveBy* moveBack= MoveBy::create( 1.0f , Vec2(-150,0));<span style="white-space:pre"> </span>// 左移 150
Sequence* se = Sequence::create(moveby,moveBack,nullptr);<span style="white-space:pre"> </span>// 创建序列
Repeat* repeat = Repeat::create( se , 5 );<span style="white-space:pre"> </span>// 重复序列5次
sp->runAction(repeat);
上列代码运行,会看到sprite来回移动5次,最后停在原来的位置。

Repeat 类:第一个是重复的动作,第二个是重复的次数。

RepeatForever类:无限重复动作。

五、回调 CallFuncN

	auto action = Sequence::create(
MoveBy::create(2.0f, Vec2(150,0)), //右移150
CallFuncN::create( CC_CALLBACK_1(ActionTest::callback, this)),//回调类中的某个自定义函数,传入本节点
nullptr);
sp->runAction(action);

在播放完后,调用某一个自定义函数以完成后续逻辑。

关于回调函数的详细,请看这篇 文章,cocos2D-x 3.x 自带的示例 ActionsTest.cpp 中有更多的例子。


以上,如有错漏,望能指正,明天研究缓动效果和动画。