cocos2d-x 3.x之动作

Action是动作的基类,所有的动作都派生自这个类,它创建的一个对象代表了一个动作。动作作用于Node,因此,任何一个动作都需要由Node对象来执行。

?
1
2
3
4
5
6
7
// 将一个精灵用3秒钟时间从屏幕中间移动到(0,0)的位置
auto tortoise = Sprite::create( "other/tortoise.png" );
tortoise->setPosition(Vec2(visibleSize.width/ 2 + visibleOrigin.x,visibleSize.height/ 2 + visibleOrigin.y));
this ->addChild(tortoise);
auto action = Moveto::create( 3 .0f,Vec2( 0 + visibleOrigin.x, 0 + visibleOrigin.y));
tortoise->runAction(action);
一个Action只能使用一次,这是因为动作对象不仅描述了动作,还保存了这个动作持续过程中不断改变的一些中间参数。

Action作为一个基类,其实质是一个接口(抽象类),由它派生的实现类(如运动和转动等)才是我们实际使用的动作。Action的绝大多数实现类都派生自Action的子类FiniteTimeAction,这个类定义了在有限时间内可以完成的动作。FiniteTimeAction定义了reverse方法,通过这个方法可以获得一个与原动作相反的动作(逆动作),例如隐藏一个精灵后,用逆动作再显示出来。并非所有的动作都对应有逆动作,例如类似“放大到”等设置属性为常量的动作不存在逆动作,而设置属性为相对值的动作则往往存在相应的逆动作。

FiniteTimeAction派生出的两个主要类分别是瞬时动作ActionInstant和持续性动作ActionInterval。
瞬时动作指能够立刻完成的动作,是FiniteTimeAction中动作持续时间为0的特例。这类动作是在下一帧会立刻执行并完成的动作,如设定位置、设定缩放等。这类动作原本可以通过简单地对Node赋值完成,但是把它们包装为动作后,可以方便地与其他动作类组合为复杂动作。

1.一些常用的瞬时动作:

Place

该动作用于将节点放置到某个指定位置,其作用于修改节点的Position属性相同。
?
1
2
3
// 将精灵放到屏幕坐标(200,200)处
auto placeAction = Place::create(Vec2( 200 , 200 ));
tortoise->runAction(placeAction);

FlipX和FlipY

这两个动作分别用于将精灵沿X和Y轴反向显示,其作用与设置精灵的FlipX和FlipY属性相同。
?
1
2
3
// 将精灵沿X轴反转
auto flipXAction = FlipX::create( true );
tortoise->runAction(flipXAction);

Show和Hide

这两个动作分别用于显示和隐藏节点,其作用和设置节点的visible属性相同。
?
1
2
3
// 隐藏精灵
auto hideAction = Hide::create();
tortoise->runAction(hideAction);

CallFunc

CallFunc系列动作包括__CCCallFuncND,__CCCallFuncO,CallFuncN,用来在动作中进行函数调用。当某个对象执行CallFunc系列动作时,就会调用一个事先被设置好的方法,以完成某些特别的功能
CallFunc系列动作的后缀“N”表示Node参数,指的是执行动作的对象,“D”表示Data参数,指的是用户自定义的数据,“O”表示对象,指的是一个用户自定义的Object(Ref)参数。
?
1
2
3
4
5
6
7
8
9
10
// 在动作中进行函数调用,可以是类成员函数,也可以是普通函数
// void fun(Node *node) 普通函数
void HelloWorld::fun(Node *node)
{
cclOG( "CallFuncN" );
}
// auto callFuncAction = CallFuncN::create(fun); 在动作中调用普通函数
auto callFuncAction = CallFuncN::create( this ,callfuncN_selector(HelloWorld::fun)); // 动作中调用类成员函数
tortoise->runAction(callFuncAction);

2.持续性动作是在持续的一段时间里完成的动作,绝大多数持续性动作都会带有一个用于控制动作执行时间的实型参数duration。每一种持续性动作通常都存在两个不同的变种动作,分别具有To和By后缀:后缀为To的动作描述了节点属性值的绝对变化,例如Moveto将对象移动到一个特定的位置;而后缀为By的动作描述了属性值的相对变化,如MoveBy将对象移动一段相对位移。
根据作用效果不同,可以将持续性动作划分为一下4大类:位置变化动作,属性变化动作,视觉特效动作,控制动作。

位置变化动作

针对位置(position)属性,引擎为我们提供了3种位置变化动作类型。

Moveto和MoveBy用于使节点做直线运动。

?
1
2
3
4
5
6
7
// 在规定时间内,从当前位置直线移动到设定的终点位置
auto movetoAction = Moveto::create( 3 .0f,Vec2( 0 , 0 ));
tortoise->runAction(movetoAction);
// 在规定时间内,相对当前位置移动(100,100),效果是往右上角移动
auto moveByAction = MoveBy::create( 3 .0f,Vec2( 100 , 100 ));
tortoise->runAction(moveByAction);

JumpTo和JumpBy使节点以一定的轨迹跳跃到指定位置

?
1
2
3
4
5
6
7
// 在规定时间内,从当前位置跳跃到设定的终点位置,第一个参数表示持续时间,第二个参数表示移动的终点位置,第三个表示跳跃最大高度,第四个参数表示跳跃次数
auto jumpToAction = JumpTo::create( 3 .0f, 0 ), 50 .0f, 5 );
tortoise->runAction(jumpToAction);
// 在规定时间内,相对当前位置跳跃(300,300),效果是往右上角跳跃
auto jumpByAction = JumpBy::create( 3 .0f,Vec2( 300 , 300 ), 5 );
tortoise->runAction(jumpByAction);

BezierTo和BezierBy使节点进行曲线运动,运动轨迹由贝塞尔曲线描述。每一个贝塞尔曲线都包含一个起点和一个终点。在一条曲线中,起点和终点都各自包含一个控制点,而控制点到端点的连线称作控制线。控制线决定了从端点发出的曲线的形状,包含角度和长度两个参数,角度决定了它所控制的曲线的方向,即这段曲线在这一控制点的切线方向,长度控制曲线的曲率。控制线越长,它所控制的曲线离控制线越近。任意一段曲线都可以由一段或几段相连的贝塞尔曲线组成。

?
1
2
3
4
5
6
7
// 使用时需要先创建ccBezierConfig结构体,设置好终点endPosition以及两个控制点controlPoint_1和controlPoint_2后,再把结构体传入BezierTo或BezierBy的初始化方法
ccBezierConfig bezier;
bezier.controlPoint_1 = Vec2( 20 , 150 );
bezier.controlPoint_2 = Vec2( 200 , 30 );
bezier.endPosition = Vec2( 160 , 30 );
auto bezierToAction = BezierTo::create( 3 .0f,bezier);
tortoise->runAction(bezierToAction);

属性变化动作

通过属性值的逐渐变化来实现动画效果

Scaleto和ScaleBy产生缩放效果

?
1
2
3
// 第二个参数为缩放系数
auto scaletoAction = Scaleto::create( 3 .0f, 2 );
tortoise->runAction(scaletoAction);

Rotateto和RotateBy产生旋转效果

?
1
2
3
// 第二个参数是角度,正方向为顺时针
auto rotatetoAction = Rotateto::create( 3 .0f, 30 .0f);
tortoise->runAction(rotatetoAction);

FadeIn和FadeOut前者实现淡入效果,后者实现淡出效果

Fadeto设置一段时间内透明度的变化效果

TintTo和TintBy设置色调变化

只有实现了CCRGBAProtocol接口的节点才可以执行这类动作,这是因为与透明度或颜色相关的属性都继承自CCRGBAProtocol接口。许多常见的节点,如Sprite和LayerColor等,都实现了这个接口。
?
1
2
3
4
5
6
7
// 用持续时间和不透明度创建动作,第二个参数glubyte类型是8位无符号整数,因此可取0-255中的任意整数,与透明度有关的动作只能应用在精灵上,且子节点不受父节点影响。
auto fadetoAction = Fadeto::create( 3 .0f, 100 );
tortoise->runAction(fadetoAction);
// rgb取值范围为0-255
TintTo::create( float duration,glubyte red,glubyte green,glubyte blue);
TintBy::create( float duration,GLshort deltaRed,GLshort deltaGreen,GLshort deltaBlue);

视觉特效动作

Blink使目标节点闪烁

?
1
2
3
// 3秒内闪烁5次
auto blinkAction = Blink::create( 3 .0f, 5 );
tortoise->runAction(blinkAction);

Animate播放帧动画

控制动作

控制动作用于对动作进行精细控制。

DelayTime将动作延续一段时间。

Repeat把现有动作重复一定次数

RepeatForever使一个动作不断重复下去。


3.复合动作

组合各种基本动作来产生复杂的动作效果

Repeat和RepeatForever

?
1
2
3
// 重复动作
auto repeatAction = Repeat::create(blinkAction, 3 );
tortoise->runAction(repeatAction);

Spawn并列动作

一批动作同时执行。执行的动作必须是能够同时执行的、继承自FiniteTimeAction的动作。组合后Spawn最终完成时间是由其成员中最大执行时间的动作来决定。

Sequence序列动作

按顺序执行一系列动作。部分非延时动作不被支持,如RepeatForever。

DelayTime延时动作

表示动作序列里的一段空白期,通过占位的方式将不同的动作串接在一起,什么都不做。

4.变速动作

Speed用于线性的改变某个动作的速度,使动作持续更长或更短的时间。Speed动作不能作为一个动作序列的一部分,因为它不是一个ActionInterval对象。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 改变Moveto动作的速度
auto movetoAction = Moveto::create( 10 .0f, 100 ));
// 两个参数分别为目标动作和变速比率,设置变速比率为1,目标动作的速度不会被改变
auto speedAction = Speed::create(movetoAction, 1 );
// 设置动作的tag属性,与Node的tag属性类似,用于方便查找动作
speedAction->setTag( 0 );
sprite->runAction(speedAction);
// 设置一个定时器,4秒后将Moveto动作速度变为原来的10倍
this ->scheduleOnce(schedule_selector(HelloWorld::changeSpriteSpeed), 4 );
// 定时器实现
void HelloWorld::changeSpriteSpeed( float data)
{
Speed *speed = dynamic_cast<speed *= "" >(sprite->getActionByTag( 0 ));
speed->setSpeed( 10 );
}</speed>

ActionEase

Speed只能按比例改变目标动作的速度,如果我们要实现动作由快到慢、速度随时间改变的变速运动,需要不停地修改它的speed属性才能实现。而ActionEase系列动作通过使用内置的多种自动速度变化来解决这一问题。
ActionEase动作可以被概括为5类动作:指数缓冲、Sine缓冲、弹性缓冲、跳跃缓冲和回震缓冲。每一类动作都有3个不同时期的变化:In、Out和InOut。
?
1
2
3
auto movetoAction = Moveto::create( 10 .0f,Vec2( 100 , 100 ));
auto easeSineInAction = EaseSineIn::create(movetoAction);
tortoise->runAction(easeSineInAction);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


    本文实践自 RayWenderlich、Ali Hafizji 的文章《How To Create Dynamic Textures with CCRenderTexture in Cocos2D 2.X》,文中使用Cocos2D,我在这里使用Cocos2D-x 2.1.4进行学习和移植。在这篇文章,将会学习到如何创建实时纹理、如何用Gimp创建无缝拼接纹
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@163.com微信公众号:HopToad 欢迎转载,转载标注出处:http://blog.csdn.netotbaron/article/details/424343991.  软件准备 下载地址:http://cn.cocos2d-x.org/download 2.  简介2.1         引用C
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从Cocos2D-x官网上下载,进入网页http://www.cocos2d-x.org/download,点击Cocos2d-x以下的Download  v3.0,保存到自定义的文件夹2:从python官网上下载。进入网页https://www.python.org/downloads/,我当前下载的是3.4.0(当前最新
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发引擎,易学易用,支持多种智能移动平台。官网地址:http://cocos2d-x.org/当前版本:2.0    有很多的学习资料,在这里我只做为自己的笔记记录下来,错误之处还请指出。在VisualStudio2008平台的编译:1.下载当前稳
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《最强大脑》娱乐节目。将2048改造成一款挑战玩家对数字记忆的小游戏。邮箱:appdevzw@163.com微信公众号:HopToadAPK下载地址:http://download.csdn.net/detailotbaron/8446223源码下载地址:http://download.csdn.net/
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试以QtCreatorIDE来进行CMake构建。Cocos2d-x3.X地址:https://github.com/cocos2d/cocos2d-x1.打开QtCreator,菜单栏→"打开文件或项目...",打开cocos2d-x目录下的CMakeLists.txt文件;2.弹出CMake向导,如下图所示:设置
 下载地址:链接:https://pan.baidu.com/s/1IkQsMU6NoERAAQLcCUMcXQ提取码:p1pb下载完成后,解压进入build目录使用vs2013打开工程设置平台工具集,打开设置界面设置: 点击开始编译等待编译结束编译成功在build文件下会出现一个新文件夹Debug.win32,里面就是编译
分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net前言上次用象棋演示了cocos2dx的基本用法,但是对cocos2dx并没有作深入的讨论,这次以超级马里奥的源代码为线索,我们一起来学习超级马里奥的实
1. 圆形音量button事实上作者的本意应该是叫做“电位计button”。可是我觉得它和我们的圆形音量button非常像,所以就这么叫它吧~先看效果:好了,不多解释,本篇到此为止。(旁白: 噗。就这样结束了?)啊才怪~我们来看看代码:[cpp] viewplaincopyprint?CCContro
原文链接:http://www.cnblogs.com/physwf/archive/2013/04/26/3043912.html为了进一步深入学习贯彻Cocos2d,我们将自己写一个场景类,但我们不会走的太远,凡是都要循序渐进,哪怕只前进一点点,那也至少是前进了,总比贪多嚼不烂一头雾水的好。在上一节中我们建
2019独角兽企业重金招聘Python工程师标准>>>cocos2d2.0之后加入了一种九宫格的实现,主要作用是用来拉伸图片,这样的好处在于保留图片四个角不变形的同时,对图片中间部分进行拉伸,来满足一些控件的自适应(PS: 比如包括按钮,对话框,最直观的形象就是ios里的短信气泡了),这就要求图
原文链接:http://www.cnblogs.com/linji/p/3599478.html1.环境和工具准备Win7VS2010/2012,至于2008v2版本之后似乎就不支持了。 2.安装pythonv.2.0版本之前是用vs模板创建工程的,到vs2.2之后就改用python创建了。到python官网下载版本2.7.5的,然后
环境:ubuntu14.04adt-bundle-linux-x86_64android-ndk-r9d-linux-x86_64cocos2d-x-3.0正式版apache-ant1.9.3python2.7(ubuntu自带)加入环境变量exportANDROID_SDK_ROOT=/home/yangming/adt-bundle-linux/sdkexportPATH=${PATH}:/$ANDROID_SDK_ROOTools/export
1开发背景游戏程序设计涉及了学科中的各个方面,鉴于目的在于学习与进步,本游戏《FlappyBird》采用了两个不同的开发方式来开发本款游戏,一类直接采用win32底层API来实现,另一类采用当前火热的cocos2d-x游戏引擎来开发本游戏。2需求分析2.1数据分析本项目要开发的是一款游
原文链接:http://www.cnblogs.com/linji/p/3599912.html//纯色色块控件(锚点默认左下角)CCLayerColor*ccc=CCLayerColor::create(ccc4(255,0,0,128),200,100);//渐变色块控件CCLayerGradient*ccc=CCLayerGradient::create(ccc4(255,0,0,
原文链接:http://www.cnblogs.com/linji/p/3599488.html//载入一张图片CCSprite*leftDoor=CCSprite::create("loading/door.png");leftDoor->setAnchorPoint(ccp(1,0.5));//设置锚点为右边中心点leftDoor->setPosition(ccp(240,160));/
为了答谢广大学员对智捷课堂以及关老师的支持,现购买51CTO学院关老师的Cocos2d-x课程之一可以送智捷课堂编写图书一本(专题可以送3本)。一、Cocos2d-x课程列表:1、Cocos2d-x入门与提高视频教程__Part22、Cocos2d-x数据持久化与网络通信__Part33、Cocos2d-x架构设计与性能优化内存优
Spawn让多个action同时执行。Spawn有多种不同的create方法,最终都调用了createWithTwoActions(FiniteTimeAction*action1,FiniteTimeAction*action2)方法。createWithTwoActions调用initWithTwoActions方法:对两个action变量初始化:_one=action1;_two=action2;如果两个a
需要环境:php,luajit.昨天在cygwin上安装php和luajit环境,这真特么是一个坑。建议不要用虚拟环境安装打包环境,否则可能会出现各种莫名问题。折腾了一下午,最终将环境转向linux。其中,luajit的安装脚本已经在quick-cocos2d-x-develop/bin/中,直接luajit_install.sh即可。我的lin
v3.0相对v2.2来说,最引人注意的。应该是对触摸层级的优化。和lambda回调函数的引入(嗯嗯,不枉我改了那么多类名。话说,每次cocos2dx大更新。总要改掉一堆类名函数名)。这些特性应该有不少人研究了,所以今天说点跟图片有关的东西。v3.0在载入图片方面也有了非常大改变,仅仅只是