精灵就是cocos是屏幕上移动的对象,它能被控制,比如我们HelloWorld场景的这个图片就是精灵(Sprite)

怎么才算精灵?你能控制它的,就是一个精灵,否则就只是一个节点(Node)

准确的说,精灵是一个能通过改变自身的属性:角度,位置,缩放,颜色等,变成可控制动画的 2D 图像

精灵很容易被创建,它有一些可以被配置的属性,比如:位置,旋转角度,缩放比例,透明度,颜色,等等

auto mySprite = Sprite::create("xxxxxx.png");
// 改变位置
mySprite->setPosition(Vec2(500, 0));
// 设置旋转角度
mySprite->setRotation(40);
// 设置缩放比例
mySprite->setScale(2.0);
// 设置锚点
mySprite->setAnchorPoint(Vec2(0, 0));

创建精灵

我们的HelloWorld直接使用了一张图像来创建精(PNG, JPEG, TIFF, WebP,都可以),但也有一些其它的方式,比如使用图集精灵缓存创建

图片创建

回一下HelloWorld场景里的代码

auto sprite = Sprite::create("sinnosuke.png");

精灵会使用整张图像,图像是多少的分辨率,创建出来的精灵就是多少的分辨率

但如果你想要的是一个 尺寸只有原始图像一部分的精灵,你可以在创建的时候指定一个矩形

指定矩形

指定矩形需要四个值,初始 x 坐标,初始 y 坐标,矩形宽,高

auto sprite = Sprite::create("sinnosuke.png", Rect(0, 0, 50, 50));
//我的图片分辨率是200*200

效果就是新之助会一只眼盯着你

矩形的初始坐标要从图形的左上角开始算,即左上角的坐标是 (0, 0)

如果你把矩形的宽高指定为图像的宽高,矩形的初始坐标指定为 (0, 0),那和默认设定是一样的(这里图片的分辨率就是200x200)

auto sprite = Sprite::create("sinnosuke.png");
//效果相同
auto sprite = Sprite::create("sinnosuke.png", Rect(0,0,200,200));

图集创建

图集(Sprite Sheet)是通过专门的工具将多张图片合并成一张大图,并通过 plist 等格式的文件索引的资源,使用图集比使用多个独立图像占用的磁盘空间更少,还会有更好的性能,这种方式已经是游戏行业中提高游戏性能的标准方法之一

下图就是一个图集

在使用图集时,首先要将其全部加载到名叫 SpriteFrameCache 的缓存中

SpriteFrameCache 是一个全局的缓存类,缓存了添加到其中的 SpriteFrame 对象,提高了精灵的访问速度,SpriteFrame 只加载一次,后续一直保存在 SpriteFrameCache

加载图集

获取到 SpriteFrameCache 的实例,把图集添加到实例中

auto spritecache = SpriteFrameCache::getInstance();
spritecache->addSpriteFramesWithFile("sprites.plist");

现在我们就能利用这个对象创建精灵了

精灵缓存

Cocos2d-x 为了提高精灵的访问速度,提供了一个精灵的缓存机制。

我们可以创建一个精灵并把精灵放到精灵的缓存对象SpriteFrameCache中:

auto mysprite = Sprite::createWithSpriteFrameName("mysprite.png");

相对的,我们也可以从精灵的缓存对象 SpriteFrameCache 访问一个精灵

访问方法是先从缓存对象中获取对应的 SpriteFrame,然后从 SpriteFrame创建精灵,方法:

auto newspriteFrame =
SpriteFrameCache::getInstance()->getSpriteFrameByName("Blue_Front1.png");
auto newSprite =
Sprite::createWithSpriteFrame(newspriteFrame);

控制精灵

在创建完精灵后,你可以开始修改精灵的属性去控制它了

锚点

所有的节点(Node)对象都有锚点值SpriteNode 的子类,自然也具有锚点

锚点是节点对象在计算坐标位置时的一个基准点,理解不了没关系,直接看图:

以我们刚才的展示的精灵为例,设置锚点(0,0):

mySprite->setAnchorPoint(Vec2(0, 0));

精灵的左下角(0, 0)就变为了计算坐标的基准点,setAnchorPoint就以这个基准点来设定精灵位置

再看看其它的锚点效果(红点表示锚点的位置)

锚点对于确定节点对象的位置非常有用的

默认情况下,所有的节点对象锚点是 (0.5, 0.5)

位置

精灵的位置受锚点影响,当我们想设置一个精灵的位置时,主要使用 setPosition() 方法,只有想改变精灵与基准坐标点的相对位置时,才考虑使用 setAnchorPoint() 设置锚点

// position a sprite to a specific position of x = 100, y = 200.
mySprite->setPosition(Vec2(100, 200));

旋转

通过setRotation() 方法,设置一个角度值可控制精灵的旋转,正值精灵顺时针旋转,负值精灵逆时针旋转,默认位置的角度值是0.0

mySprite->setRotation(20.0f);

mySprite->setRotation(-20.0f);

mySprite->setRotation(60.0f);

mySprite->setRotation(-60.0f);

结果如下

缩放

通过setScale()方法控制精灵的缩放,可以控制精灵水平缩放,垂直缩放,也可以整体缩放,默认水平和竖直的缩放值都是1.0

mySprite->setScale(2.0);

mySprite->setScaleX(2.0);

mySprite->setScaleY(2.0);

倾斜

通过 setSkewX() 控制精灵的倾斜度,可以控制精灵水平倾斜,竖直倾斜,或者水平竖直同时倾斜,默认水平和竖直的倾斜值都是0.0

mySprite->setSkewX(20.0f);

mySprite->setSkewY(20.0f);

颜色

通过 setColor() 控制精灵的颜色。将一个 RGB 值设置到 Color3B 对象,调用精灵的 setColor() ,就能完成精灵颜色的设置,RGB 是三个从 0-255 的值,三个值分别代表红绿蓝的颜色深度,数值越大,颜色越深

如果你不想自己指定 RGB 的三个值,也可以使用 Cocos2d-x 提供的预定义颜色,比如: Color3B::WhiteColor3B::Red

mySprite->setColor(Color3B::WHITE);
//等效于
mySprite->setColor(Color3B(255, 255, 255));

透明度

精灵的透明度可以通过 setOpacity() 传入一个特定的值来设置,这个值的范围是0-255,数值越大透明度越低,255 代表完全不透明,0 代表完全透明

mySprite->setOpacity(30);

多边形精灵

多边形精灵(Polygon Sprite) 也是精灵

普通精灵在绘图处理中被分为了两个三角形,多边形精灵则是被分为了一系列三角形

为什么要使用多边形精灵

因为可以提高性能,真的,深入分析这个是如何提高性能的,会需要很多和像素填充率有关的技术术语,所以我们这里先不深入,只要知道能提高性能就行了

注意上图

  • 左侧,精灵绘制时被处理成一个有两个三角形组成的矩形
  • 右侧,精灵被处理成一系列小的三角形

右侧多边形精灵需要绘制的像素数量比左侧精灵需要的像素数量更小

AutoPolygon

AutoPolygon是一个工具类,它可以在程序运行时,通过跟踪关键点和三角测量,将一个矩形图像划分成一系列小三角形块

首先将图像资源传入 AutoPolygon 进行处理,然后我们使用它生成的对象进行精灵的创建就能得到多边形精灵

auto pinfo = AutoPolygon::generatePolygon("xxxxxx.png");
auto sprite = Sprite::create(pinfo);

Cocos2d-x入门之旅[2]精灵的更多相关文章

  1. Swift语言入门之旅

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

  2. 如何在Cocos2D 1.0 中掩饰一个精灵(六)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰一个精灵:实现代码 打开HelloWorldLayer.m并 ...

  3. 如何在Cocos2D 1.0 中掩饰一个精灵(四)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 为了完成需要的效果,我们将使用如下策略: 我们将首先绘制掩饰精灵 ...

  4. 如何在Cocos2D 1.0 中掩饰一个精灵(一)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 原帖来自Ray Wunderlich写的精彩的文章 How To ...

  5. 如何在Cocos2D 1.0 中掩饰一个精灵(五)

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 掩饰和CCRenderTexture CCRenderTextu ...

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

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

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

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

  8. cocos2d基础入门

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

  9. cocos2d(CCSprite绑定不规则刚体与精灵一起移动)

    对于不规则的精灵我们可以借助PhysicsEditor来制作shape , 对于地图可以使用Tiled软件制作瓷砖地图. 今天主要记录一下如何把CCSprite与不规则刚体进行绑定,然后一起移动 // ...

随机推荐

  1. css 实现居中的五种方式

      一 .文字居中 1 固定容器高度的单行文本垂直居中:height=line-height         2 未知容器高度的文本垂直居中:设定padding,使上下的padding值相同即可   ...

  2. Python集训营45天—Day02

    目录 变量和运算符 1.1 初步介绍 1.2 使用案例 1.3 知识点梳理 1.4 练习 序言:这一章我们将学习变量以及常见的类型,我们将以案例和代码相结合的方式进行梳理,但是其中所有的案例和知识点 ...

  3. Java,Python,前端,Linux,公众号等5T编程资源整理免费下载

    场景 我的CSDN: https://blog.csdn.net/BADAO_LIUMANG_QIZHI 实现 马士兵Java学习视频 方立勋JavaWeb 尚硅谷Python核心基础 数据分析 机器 ...

  4. SqlServer 2014 还原数据库时提示:操作系统返回了错误5,,拒绝访问

    场景 在进行数据库还原时提示: System.Data.SqlError:在对”“尝试”“时,操作系统返回了错误5(拒绝访问) 实现 第一种方案是修改要还原的数据库备份文件的权限. 找到备份文件右击属 ...

  5. airflow使用本地时区

    ​ 在airflow中使用的时间是utc时间,而更多时候我们希望的是使用本地时间,于是在定义airflow定时任务的时候,涉及到了时间的转换. 1.python中本地时间和utc时间的转换 查看国内可 ...

  6. chrome,firefox浏览器字体发虚解决办法

    打开微软自家的edge浏览器,字体就没有问题,刚开始以为是浏览器的问题,调整半天也没有效果,后来怀疑是Windows系统的问题,于是尝试调整字体,成功解决! 解决方案: 进入个性化->字体-&g ...

  7. 会计的疑惑--BigDecimal的秘密

    为了提供公司的财务信息化,公司A上线了一套自主研发的财务系统,上班第一天,财务C姐就发现了情况不对:几项支出都对,但支出总和一直为0,赶紧向大老板报告.大老板勃然大怒,责令技术部门今天必须解决,小B负 ...

  8. 远程桌面连接mstsc 超扎心

    搞了一天问了几千个人.最后终于有一位大佬解决了.扎心啊. http://jingyan.baidu.com/article/39810a23edc48bb637fda672.html 就是服务没打开.

  9. leveldb 源码--总体架构分析

    一 本文目的 对leveldb的总体设计框架分析(关于leveldb基本原理,此文不做阐述,读者可以自行检索文章阅读即可),对leveldb中底层数据存储数据格式,内存数据模型,compact,版本管 ...

  10. 【IT技术概念】什么是webservice?

    WebService是一个SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平台,可以实现不同的语言间的相互调用,通过Internet进行基于Http协议的网络应用间的交互. WebServi ...