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);

精灵就会按次序执行序列里的动作

序列我们之后再详细讲解

基本动作

移动

MoveToMoveBy,使精灵在指定时间内移动到指定地点

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);

效果如上图

旋转

RotateToRotateBy,使精灵在指定时间内旋转到指定角度

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

SpawnSequence 非常相似,但 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 对象反向执行,还能让 SequenceSpawn 倒转

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]动作的更多相关文章

  1. Swift语言入门之旅

    Swift语言入门之旅  学习一门新的计算机语言,传统来说都是从编写一个在屏幕上打印"Hello world"的程序開始的.那在 Swift,我们使用一句话来实现它: printl ...

  2. cocos2d基础入门

    HelloCpp中Classes目录下放开发者自己的类: win32:平台相关,coco2d已默认创建:coco2d-x目录下,samples/cpp/HelloCpp/(工程根目录)图片放置位置:根 ...

  3. gym强化学习入门demo——随机选取动作 其实有了这些动作和反馈值以后就可以用来训练DNN网络了

    # -*- coding: utf-8 -*- import gym import time env = gym.make('CartPole-v0') observation = env.reset ...

  4. Cocos2d-x入门之旅[1]场景

    在游戏开发过程中,你可能需要一个主菜单,几个关卡和一个END的界面,如何组织管理这些东西呢? 和其他游戏引擎类似,Cocos也使用了场景(Scene) 这个概念 试想象一部电影或是番剧,你不难发现它是 ...

  5. Cocos2d-x入门之旅[4]场景

    我们之前讲了场景图(Scene Graph) 的概念,继续之前你先要知道 场景图决定了场景内节点对象的渲染顺序 渲染时 z-order 值大的节点对象会后绘制,值小的节点对象先绘制 HelloWorl ...

  6. Cocos2d-x入门之旅

    Cocos通过动作(Action)让精灵动起来,把数个动作组成序列(Sequence)就能让精灵做出连续的动作,在动作中我们可以改变精灵的位置,旋转角度,缩放比例,等等 动作(Action)# 首先我 ...

  7. IOS-swift5.1快速入门之旅

    快速之旅 传统表明,新语言中的第一个程序应在屏幕上打印“Hello,world!”字样.在Swift中,这可以在一行中完成: print("Hello, world!") // P ...

  8. 云原生 - 体验Istio的完美入门之旅(一)

    作者:justmine 头条号:大数据达摩院 微信公众号:大数据处理系统 创作不易,在满足创作共用版权协议的基础上可以转载,但请以超链接形式注明出处. 为了方便大家阅读,可以关注头条号或微信公众号,后 ...

  9. ROR入门之旅

    mac上为了不在登录画面看到其他账户,我禁用了root账户,而每次用Terminal的时候,先获得sudo账户的权限: sudo -s mac本身就安装有ruby ruby -v 查看当前安装的rub ...

随机推荐

  1. 007 Python程序语法元素分析

    目录 一.概述 二.程序的格式框架 2.1 代码高亮 2.2 缩进 2.3 注释 2.4 缩进.注释 三.命名与保留字 3.1 变量 3.2 命名 3.3 保留字 3.4 变量.命名.保留字 四.数据 ...

  2. apache ignite系列(九):ignite调优

    1,配置文件调优 1.1 设置页面大小(pagesize) 先查看系统pagesiz,使用PAGE_SIZE或者PAGESIZE # getconf PAGE_SIZE 4096 # getconf ...

  3. 用vetr.x写一个HTTP接口适配器, 对接各种形式接口

    用vetr.x写一个HTTP接口适配器, 对接各种形式接口 项目地址:https://github.com/hjx601496320/transmit 业务说明 在日常开发工作中,我们经常会遇到要和各 ...

  4. 松软科技课堂:SQL-SELECT-INTO语句

    SQL SELECT INTO 语句可用于创建表的备份复件. SELECT INTO 语句 SELECT INTO 语句从一个表中选取数据,然后把数据插入另一个表中. SELECT INTO 语句常用 ...

  5. 《JavaScript设计模式与开发实践》读书笔记-基础知识

    笔记内容多摘录自<JavaScript设计模式与开发实践>(曾探著),侵删. 面向对象的JavaScript 1. 动态需要类型和鸭子类型 鸭子类型 如果它走起路来像鸭子,叫起来也是鸭子, ...

  6. 【Unity与Android】01-Unity与Android交互通信的简易实现

    前言 使用Unity也有不短的时间了,安卓包也打过不少,但是对Unity与Android的交互却知之甚少. 因工作需求,需要在Android平台接一些sdk(扩展功能).我就借此机会就了解了下Unit ...

  7. 【带着canvas去流浪(14)】Three.js中凹浮雕模型的生成方式

    目录 一. 方案1:ThreeBSP.js或ThreeCSG.js扩展库 二. 方案2:平面镂空模型拉伸 三. 方案3:Cinema 4D建模后输出模型文件 示例代码托管在:http://www.gi ...

  8. [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 ...

  9. 关于瀑布流的布局原理分析(纯CSS瀑布流与JS瀑布流)

    瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑 ...

  10. java架构之路-(mysql底层原理)Mysql之让我们再深撸一次mysql

    让我再深撸一次mysql吧,这次主要以应对面试来说说mysql,大概几个方向,索引结构,查询引擎,索引优化,explain的详解和trace工具的使用. 索引: 我们先来看一下mysql的B+tree ...