前端之家收集整理的这篇文章主要介绍了
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)处的代码如下:
-
- autoplaceAction=Place::create(Point(50,200));
-
- autosprite_1=Sprite::create("role1.png");
- //先添加
- this->addChild(sprite_1);
- //类似于setPosition功能
- sprite_1->runAction(placeAction);
相当于把这个精灵放到 (50,200)处。
2、FlipX和FlipY
这两个动作分别用于将精灵沿X轴和Y轴反向显示,其作用与设置精灵的FlipX和FlipY属性相同,将其封装成动作接口是为了便于与其他动作进行组合。
下面代码将一个精灵移动到一端后反向显示再进行移回的动作:
copy
//开启翻转
autoflipxAction=FlipX::create(true);
//移到Point(400,200),使用2s
automoveToActionGo=MoveTo::create(2.0f,Point(300,500));
//移到Point(50,50),248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> automoveToActionBack=MoveTo::create(2.0f,Point(50,50));
//Sequence是动作序列,以NULL表示参数传入结束
autoaction=Sequence::create(moveToActionGo,flipxAction,moveToActionBack,NULL);
autosprite_2=Sprite::create("role1.png");
this->addChild(sprite_2);
sprite_2->runAction(action);
3、Show和Hide
这两个动作分别用于显示和隐藏节点,其作用与设置节点的visible属性作用一样。例如:为了使精灵完成移动后隐藏起来。
代码如下:
copy
//隐藏
autohideAction=Hide::create();
//显示
autoshowAction=Show::create();
//移到Point(100,100),使用1s
automoveToAction_1=MoveTo::create(1.0f,Point(100,100));
//移到Point(200,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> automoveToAction_2=MoveTo::create(1.0f,Point(200,0); background-color:inherit">//移到Point(300,300),248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> automoveToAction_3=MoveTo::create(1.0f,300));
//Sequence是动作序列,以NULL表示参数传入结束,移到_1后隐藏,移动_2后显示
autoaction=Sequence::create(moveToAction_1,hideAction,moveToAction_2,showAction,moveToAction_3,108); list-style-type:decimal-leading-zero; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> autosprite_3=Sprite::create("role1.png");
this->addChild(sprite_3);
4、CallFunc与CallFuncN
在cocos2dx 3.x版本后CallFunc系列动作只包括CallFunc、CallFuncN两个动作,CallFuncN需要添加一个node节点作为参数,传递给调用函数,他们都是用来在动作中进行方法调用,如在游戏中为了节约内存资源,
我们可以在动作完成后调用相应函数清理内存等一系列操作。
在2.x版本中的CallFuncND 和 CallFuncO 都可以通过 CallFunc 和 CallFuncN 进行实现。
4.1CallFunc
看完声明后,我们看看几种CallFunc使用的不同写法
copy
//写法1
autoaction1=CallFunc::create(CC_CALLBACK_0(MyClass::callback_0,this));
autoaction2=CallFunc::create(CC_CALLBACK_0(MyClass::callback_1,153); background-color:inherit; font-weight:bold">this,additional_parameters));
//写法2
autoaction1=CallFunc::create(std::bind(&MyClass::callback_0,108); list-style-type:decimal-leading-zero; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> autoaction2=CallFunc::create(std::bind(&MyClass::callback_1,0); background-color:inherit">//lambdas表达式写法
autoaction1=CallFunc::create(
[&](){
autos=Director::getInstance()->getWinSize();
autolabel=LabelTTF::create("called:lambdacallback","MarkerFelt",16);
label->setPosition(ccp(s.width/4*1,s.height/2-40));
this->addChild(label);
});
4.2 CallFuncN
copy
staticCallFuncN*create(void(Node*)>&func);
注意到该回调动作带有一个Node*参数。
假设回调函数:
copy
voidHelloWorld::callback(Node*sender,intnum);
受益于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
用于使节点做直线运动,设置了动作时间和终点位置,在规定时间内会移动到终点,它们的初始化方法如下:
- //移动到Position的地方
- MoveTo::create(floatduration,constPoint&position);
- //移动的改变值为Position
- MoveBy::create(constPoint&position);
很多时候他两的
效果相似。
2、JumpTo和JumpBy
使节点以一定的轨迹跳跃到指定位置,JumpTo 是跳到Position位置,JumpBy 是跳起一段距离改变值为Position。
先看看他们声明:
看下面的代码:
copy
//以抛物线方式跳到Point(400,最大高度200,跳2次跳到
autojumpTo=JumpTo::create(3.0f,Point(400,200,2);
autoactionTo=Sequence::create(jumpTo,NULL);
autosprite_5=Sprite::create("role1.png");
this->addChild(sprite_5);
sprite_5->setPosition(Point(50,50));
sprite_5->runAction(actionTo);
////以抛物线方式跳动Point(400,最大高度200,跳4次跳到
autojumpBy=JumpBy::create(4.0f,4);
autoactionBy=Sequence::create(jumpBy,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> autosprite_6=Sprite::create("role1.png");
this->addChild(sprite_6);
sprite_6->setPosition(Point(50,108); list-style-type:decimal-leading-zero; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> sprite_6->runAction(actionBy);
3、BezierTo和BezierBy
使节点进行曲线运动,运动的轨迹由贝塞尔曲线描述。
每条贝塞尔曲线都包含一个起点和一个终点。在一条曲线中,起点和终点各自包含一个控制点,而控制点到端点的连线称作控制线。
控制点决定了曲线的形状,包含角度和长度两个参数。
如下图:
使用时,我们要先创建ccBezierConfig结构体,设置好终点endPosition以及两个两个控制点controlPoint_1和controlPoint_2后,再把结构体传入BezierTo或BezierBy的初始化方法中:
copy
//先声明一个贝尔结构体
ccBezierConfigbezier;
//设置目标位置
bezier.endPosition=Point(50,400);
//设置控制点1
bezier.controlPoint_1=Point(0,0);
//设置控制点2
bezier.controlPoint_2=Point(200,50);
autobezierTo=BezierTo::create(2.0f,bezier);
autosprite_7=Sprite::create("role1.png");
this->addChild(sprite_7);
sprite_7->runAction(bezierTo);
BezierBy基本与BezierTo一样写法
4、ScaleTo和ScaleBy
产生缩放效果,使节点的缩放系数随时间线性变化,对应初始化方法为:
copy
//缩放时间,缩放比例
ScaleTo::create(floats);
ScaleBy::create(floats);
使用样例:
copy
//原地缩放
autoscaleTo=ScaleTo::create(4.0f,108); list-style-type:decimal-leading-zero; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> autoactionTo=Sequence::create(scaleTo,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important; list-style-position:outside!important"> autosprite_8=Sprite::create("role1.png");
this->setPosition(Point(200,200));
this->addChild(sprite_8);
sprite_8->runAction(actionTo);
5、RotateTo和RotateBy
copy
//原地缩放2倍
//原地旋转90度
autorotateTo=RotateTo::create(2.0f,90.0f);
sprite_8->runAction(actionTo);
三、视觉特效动作
1、FadeIn,FadeOut和FateTo
copy
//淡入
FadeIn::create(floatd);
//淡出
FadeOut::create(//一定时间内透明度变化
FadeTo::create(
样例代码:
copy
//淡入3s完成
autofadeIn=FadeIn::create(3.0f);
//淡出4s完成
autofadeOut=FadeOut::create(4.0f);
//在5s里,透明度变化100
autofadeTo=FadeTo::create(5.0f,100);
sprite_8->runAction(actionTo);
2、TintTo和TintBy