Cocos2d-x入门之旅[3]动作
Cocos通过动作(Action)让精灵动起来,把数个动作组成序列(Sequence)就能让精灵做出连续的动作,在动作中我们可以改变精灵的位置,旋转角度,缩放比例,等等
动作(Action)
首先我们创建一个Action
对象,同样使用create
,这里我们还是使用HelloWorld场景里的那张图片
auto sprite = Sprite::create("sinnosuke.png");
在setPosition
之后我们加上一句
// 在2秒内:向右移动精灵50像素,向上移动精灵10像素
auto moveBy = MoveBy::create(2, Vec2(50, 10));
sprite->runAction(moveBy);
这个精灵就会平滑地根据我们输入的参数移动
如果把moveBy
改成moveTo
,那就会是另一种结果:
// 在2秒内:把精灵移动到坐标(50,10)
auto moveTo = MoveTo::create(2, Vec2(50, 10));
sprite->runAction(moveTo);
精灵直接移动到了(50,10)
(锚点在其正中间)
By 和 To 的区别
By
算的是相对于节点对象的当前位置To
算的是绝对位置,不考虑当前节点对象在哪
动作组合
你还可以把多个动作加入到一个序列(Sequence)里,让精灵按执行序列
auto moveBy = MoveBy::create(2, Vec2(50, 10));
auto moveTo = MoveTo::create(2, Vec2(50, 10));
auto delay = DelayTime::create(1);//设置一个一秒的延时,也加入序列中
auto seq = Sequence::create(moveBy, delay, moveTo, nullptr);
//做动作moveBy后,延时1秒,做动作moveTo
sprite->runAction(seq);
精灵就会按次序执行序列里的动作
序列我们之后再详细讲解
基本动作
移动
MoveTo
,MoveBy
,使精灵在指定时间内移动到指定地点
auto sprite = Sprite::create("sinnosuke.png");
auto delay = DelayTime::create(1);
// 在2秒内:向右移动精灵50像素,向上移动精灵10像素
auto moveBy = MoveBy::create(2, Vec2(50, 10));
// 在2秒内:把精灵移动到坐标(50,10)
auto moveTo = MoveTo::create(2, Vec2(50, 10));
auto seq = Sequence::create(moveBy, delay, moveTo, nullptr);
sprite->runAction(seq);
效果如上图
旋转
RotateTo
,RotateBy
,使精灵在指定时间内旋转到指定角度
auto sprite = Sprite::create("sinnosuke.png");
auto delay = DelayTime::create(1);
// 在2秒内:把精灵从原始位置顺时针旋转40度
auto rotateBy = RotateBy::create(2.0f, 40.0f);
// 在2秒内:把精灵从目前位置旋转到顺时针40度的位置
auto rotateTo = RotateTo::create(2.0f, 40.0f);
auto seq = Sequence::create(rotateBy, delay, rotateTo, nullptr);
sprite->runAction(seq);
你应该会看到这个图片转了一次就不动了,其实不是不动了
因为在第一个动作后你已经让图片转到了顺时针40度的位置,第二个动作的目标“把精灵从目前位置旋转到顺时针40度的位置”即为目前的位置,所以看上去就是不动了
建议你把两个动作先后顺序对调一下,运行看看,方便理解
缩放
ScaleBy
ScaleTo
在指定时间内完成指定比例缩放
auto sprite = Sprite::create("sinnosuke.png");
// Scale uniformly by 3x over 2 seconds
// 在2秒内:把精灵等比放大到3倍
auto scaleBy = ScaleBy::create(2.0f, 3.0f);
// Scale X by 5 and Y by 3x over 2 seconds
// 在2秒内:把精灵的x轴放大到3倍并把y轴放大到3倍
auto scaleBy = ScaleBy::create(2.0f, 3.0f, 3.0f);
// 在2秒内:把精灵缩放到:等比放大3倍的状态
auto scaleTo = ScaleTo::create(2.0f, 3.0f);
// Scale X to 5 and Y to 3x over 2 seconds
// 在2秒内:把精灵缩放到:x轴放大到3倍,把y轴放大到3倍的状态
auto scaleTo = ScaleTo::create(2.0f, 3.0f, 3.0f);
通过对旋转的理解(主要是To和By的理解),上述代码不难看懂,这里不多给出运行效果了,感兴趣可以自己写个Sequence
测试
淡入淡出
FadeIn
淡入,FadeOut
淡出 (其实就是修改节点对象的透明度属性,FadeIn
从完全透明到完全不透明,FadeOut
相反)
auto sprite = Sprite::create("sinnosuke.png");
auto delay = DelayTime::create(1);//设置一个一秒的延时,也加入序列中
auto fadeIn = FadeIn::create(1.0f);
auto fadeOut = FadeOut::create(2.0f);
auto seq = Sequence::create(delay, fadeOut, delay, fadeIn, nullptr);
sprite->runAction(seq);
也很简单,代码也给出了,可以自己运行看看
色彩混合
使用 TintTo
TintBy
,将一个实现了 NodeRGB
协议的节点对象进行色彩混合
auto sprite = Sprite::create("sinnosuke.png");
auto delay = DelayTime::create(1);
// 指定RGB值为节点着色
auto tintTo = TintTo::create(2.0f, 120.0f, 232.0f, 254.0f);
// 指定RGB值为增量为节点着色
auto tintBy = TintBy::create(2.0f, 120.0f, 232.0f, 254.0f);
auto seq = Sequence::create(tintTo, delay, tintBy, nullptr);
sprite->runAction(seq);
变化如下:
此外还有帧动画和变速运动
帧动画使用 Animate
对象,通过每隔一个短暂时间进行图像替代的方式,实现一个动画效果
变速动作可以让节点对象具有加速度,用以模仿物理运动,降低性能损耗
序列(Sequence)
顾名思义,序列就是多个动作按照特定顺序的一个排列(当然也能反向执行)
其实序列就是一种封装多个动作的对象,当这个对象执行时,被封装的动作会顺序执行
Sequence
一个 Sequence
可以包含任何数量的动作对象,回调方法和其它序列,Cocos2d-x 允许把一个方法添加进去 CallFunc
对象,然后将 CallFunc
添加到 Sequence
,这样,在执行序列的时候就能触发方法调用
auto mySprite = Node::create();
auto moveTo1 = MoveTo::create(2, Vec2(50,10));
auto moveBy1 = MoveBy::create(2, Vec2(100,10));
auto moveTo2 = MoveTo::create(2, Vec2(150,10));
auto delay = DelayTime::create(1);
mySprite->runAction(
Sequence::create(
moveTo1,
delay,
moveBy1,
delay.clone(),
moveTo2, nullptr
)
);
Spawn
Spawn
和 Sequence
非常相似,但 Spawn
同时执行所有的动作
Spawn
对象可以添加任意数量的动作,和其它 Spawn
对象,可能不同动作的执行时间不一致,在这种情况下,他们不会同时结束
auto myNode = Node::create();
auto moveTo1 = MoveTo::create(2, Vec2(50,10));
auto moveBy1 = MoveBy::create(2, Vec2(100,10));
auto moveTo2 = MoveTo::create(2, Vec2(150,10));
myNode->runAction(Spawn::create(moveTo1, moveBy1, moveTo2, nullptr));
克隆
克隆(Clone) 的功能和字面含义一样,如果你对一个节点对象使用了 clone()
方法,你就获得了这个节点对象的拷贝
为什么要使用 clone()
方法? 因为当 Action
对象运行时会产生一个内部状态,记录着节点属性的改变,当你想将一个创建的动作,重复使用到不同的节点对象时,如果不用 clone()
方法,就无法确定这个动作的属性到底是怎样的(因为被使用过,产生了内部状态),这会造成难以预料的结果
我们来看示例,假如你有一个坐标位置是 (0,0)
的 heroSprite
,执行这样一个动作:
MoveBy::create(10, Vec2(400,100));
你的 heroSprite
就在 10s 的时间中,从 (0,0)
移动到了 (400,100)
,heroSprite
有了一个新位置 (400,100)
,更重要的是动作对象也有了节点位置相关的内部状态了
现在假如你有一个坐标位置是 (200,200)
的 emenySprite
,你还使用这个相同的动作,emenySprite
就会移动到 (800,200)
的坐标位置,并不是你想要的结果,因为第二次将这个动作应用的时候,它已经有内部状态了
使用 clone()
能避免这种情况,克隆获得一个新的动作对象,新的对象没有之前的内部状态
以下错误的用法:
auto heroSprite = Sprite::create("herosprite.png");
auto enemySprite = Sprite::create("enemysprite.png");
auto moveBy = MoveBy::create(10, Vec2(400,100));
heroSprite->runAction(moveBy);
enemySprite->runAction(moveBy);
使用 clone()
的正确情况:
auto heroSprite = Sprite::create("herosprite.png");
auto enemySprite = Sprite::create("enemysprite.png");
auto moveBy = MoveBy::create(10, Vec2(400,100));
heroSprite->runAction(moveBy);
enemySprite->runAction(moveBy->clone());
倒转
倒转(Reverse) 的功能也和字面意思一样,调用 reverse()
可以让一系列动作按相反的方向执行,reverse()
不是只能简单的让一个 Action
对象反向执行,还能让 Sequence
和 Spawn
倒转
mySprite->runAction(mySpawn->reverse());
应用实例
auto mySprite = Sprite::create("mysprite.png");
mySprite->setPosition(50, 56);
auto moveBy = MoveBy::create(2.0f, Vec2(500,0));
auto scaleBy = ScaleBy::create(2.0f, 2.0f);
auto delay = DelayTime::create(2.0f);
auto delaySequence = Sequence::create(delay, delay->clone(), delay->clone(),
delay->clone(), nullptr);
auto sequence = Sequence::create(moveBy, delay, scaleBy, delaySequence, nullptr);
mySprite->runAction(sequence);
mySprite->runAction(sequence->reverse());
Cocos2d-x入门之旅[3]动作的更多相关文章
- Swift语言入门之旅
Swift语言入门之旅 学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序開始的.那在 Swift,我们使用一句话来实现它: printl ...
- cocos2d基础入门
HelloCpp中Classes目录下放开发者自己的类: win32:平台相关,coco2d已默认创建:coco2d-x目录下,samples/cpp/HelloCpp/(工程根目录)图片放置位置:根 ...
- gym强化学习入门demo——随机选取动作 其实有了这些动作和反馈值以后就可以用来训练DNN网络了
# -*- coding: utf-8 -*- import gym import time env = gym.make('CartPole-v0') observation = env.reset ...
- Cocos2d-x入门之旅[1]场景
在游戏开发过程中,你可能需要一个主菜单,几个关卡和一个END的界面,如何组织管理这些东西呢? 和其他游戏引擎类似,Cocos也使用了场景(Scene) 这个概念 试想象一部电影或是番剧,你不难发现它是 ...
- Cocos2d-x入门之旅[4]场景
我们之前讲了场景图(Scene Graph) 的概念,继续之前你先要知道 场景图决定了场景内节点对象的渲染顺序 渲染时 z-order 值大的节点对象会后绘制,值小的节点对象先绘制 HelloWorl ...
- Cocos2d-x入门之旅
Cocos通过动作(Action)让精灵动起来,把数个动作组成序列(Sequence)就能让精灵做出连续的动作,在动作中我们可以改变精灵的位置,旋转角度,缩放比例,等等 动作(Action)# 首先我 ...
- IOS-swift5.1快速入门之旅
快速之旅 传统表明,新语言中的第一个程序应在屏幕上打印“Hello,world!”字样.在Swift中,这可以在一行中完成: print("Hello, world!") // P ...
- 云原生 - 体验Istio的完美入门之旅(一)
作者:justmine 头条号:大数据达摩院 微信公众号:大数据处理系统 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便大家阅读,可以关注头条号或微信公众号,后 ...
- ROR入门之旅
mac上为了不在登录画面看到其他账户,我禁用了root账户,而每次用Terminal的时候,先获得sudo账户的权限: sudo -s mac本身就安装有ruby ruby -v 查看当前安装的rub ...
随机推荐
- 007 Python程序语法元素分析
目录 一.概述 二.程序的格式框架 2.1 代码高亮 2.2 缩进 2.3 注释 2.4 缩进.注释 三.命名与保留字 3.1 变量 3.2 命名 3.3 保留字 3.4 变量.命名.保留字 四.数据 ...
- apache ignite系列(九):ignite调优
1,配置文件调优 1.1 设置页面大小(pagesize) 先查看系统pagesiz,使用PAGE_SIZE或者PAGESIZE # getconf PAGE_SIZE 4096 # getconf ...
- 用vetr.x写一个HTTP接口适配器, 对接各种形式接口
用vetr.x写一个HTTP接口适配器, 对接各种形式接口 项目地址:https://github.com/hjx601496320/transmit 业务说明 在日常开发工作中,我们经常会遇到要和各 ...
- 松软科技课堂:SQL-SELECT-INTO语句
SQL SELECT INTO 语句可用于创建表的备份复件. SELECT INTO 语句 SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中. SELECT INTO 语句常用 ...
- 《JavaScript设计模式与开发实践》读书笔记-基础知识
笔记内容多摘录自<JavaScript设计模式与开发实践>(曾探著),侵删. 面向对象的JavaScript 1. 动态需要类型和鸭子类型 鸭子类型 如果它走起路来像鸭子,叫起来也是鸭子, ...
- 【Unity与Android】01-Unity与Android交互通信的简易实现
前言 使用Unity也有不短的时间了,安卓包也打过不少,但是对Unity与Android的交互却知之甚少. 因工作需求,需要在Android平台接一些sdk(扩展功能).我就借此机会就了解了下Unit ...
- 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式
目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ...
- [Linux] CentOS安装GNOME时,fwupdate-efi-12-5.el7.centos.x86_64 conflicts with grub2-common-1:2.02-0.65.el7.centos.noarch
参考文章:https://createdpro.com/a/100006 该问题源于文件的版本冲突: grub2-common包的冲突,所以要将该包使用yum update grub2-commonn ...
- 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)
瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑 ...
- java架构之路-(mysql底层原理)Mysql之让我们再深撸一次mysql
让我再深撸一次mysql吧,这次主要以应对面试来说说mysql,大概几个方向,索引结构,查询引擎,索引优化,explain的详解和trace工具的使用. 索引: 我们先来看一下mysql的B+tree ...