Cocos2dx学习笔记32 Cocos2d-x里如何用TexturePacker和像素格式来优化spritesheet

原文地址:http://cn.cocos2d-x.org/tutorial/show?id=1473


预备知识

在Cocos2d-x里,为了使你的游戏获得最佳性能,你需要把许多小的 sprite 图片组合到一张大图里面,这张大图就叫做 sprite sheet(精灵表单)。

这里我们将要借助一款叫做TexturePacker的工具来创建 sprite sheet。

本教程将讲述如何在基于Cocos2d-x进行游戏开发时使用TexturePacker。同时,你还将学习到如何使用像素格式(pixel formats);TexturePacker如何智能地让你的游戏加载速度更快,运行更流畅,而且还能够在游戏界面看起来很不错的前提下使用尽可能少的内存

开始

硬件环境: MacOS X 10.9.1

开发工具:Xcode5, TexturePacker-3.2.1

引擎版本:Cocos2d-x-3.0beta

以上是我的开发环境,你大可根据你的开发环境做相应操作。直接将路径 /cocos2dx-master/tools/project-creator 中的 create_project.py 拖到终端,然后会跳出对话框如下(这是3.0之后才有的,使用之前版本的小伙伴请参考Cocos2d-x环境搭建(基于win7以及mac)):

项目创建完毕。接下来我们需要准备素材制作Sprite Sheet。Demo里用到的图片资源已经上传到我的网盘,你可以直接下载获得。下载后将其解压到你所建项目的Resources文件夹下,如下所示:

使用TexturePacker来创建spritesheet

你需要做的第一件事情就是下载TexturePacker的免费版本。请注意,你并不需要购买证书,对于这篇教程来说使用免费版本就已经足够了,当然你也可以通过给开发者发邮件获取免费证书,如果你已经有一个很不错的博客的话。

下载完之后双击进行安装,然后点击“TexturePacker-3.2.1.dmg”,接下来就会弹出一个窗口,然后按照提示一步步安装在你的Mac上。

安装完成后,在Application文件夹中找到并运行它,然后你将会看到如下的欢迎界面,这里我们选择右下方红色框所标识出来的Use Free。当然啦,如果你拥有一个高大上的密钥的话直接输入密钥就好(实际上购买密钥的话大概$50左右)。

进入到软件的主界面以后,点击工具栏中的“Add Sprites”选项会跳出一个对话框,选取你所需要的图片导入,如果你需要导入多张图片,你可以通过按下Command键+鼠标点选,一次选取多张图,然后确定导入;当然,如果你的图片存放在一个文件里面,你也可以通过“Add Folder”按钮,然后选择存放这些图片的文件夹整体导入。TexturePacker 将会加载图片并且智能地把这些图片布局在spritesheet中。

btw,你通过增加文件夹的方式增加精灵,TexturePacker并不会对所有精灵增加索引,而是对整个文件夹增加索引。当你下次再向这个文件夹增加精灵的时候,TexturePacker会重新根据文件夹下的所有精力重新创建sprite sheet。

ok,现在来熟悉一下左侧的TextureSettings栏:

  • Autosize(默认)这个选项会为你的spritesheet挑选最小的2的指数倍的大小。这是一个非常方便的特性,因为它可以省去你自己去计算spritesheet大小的时间。

  • Min/max size让你为你的spritesheet指定一个最大值。如果你想设置特定大小的spritesheet的时候,这也是一个非常方便的特性。(因为对于特定的设备来说,你可不想超过设备能够支持的最大限制,比如2代touch最大支持 texture大小为1024*1024)

  • Scale可以用于保存一个比原始图片尺寸要大一点、或者小一点的spritesheet。如果你想在 spritesheet中加载“2x"的图片(也即为Retina-display设备或者ipad创建的)。但是你同时也想为不支持高清显示的iphone和 touch制作spritesheet,这时候只需要设置scale为0.5就可以了。也就是说,只需要提供@2x的高清图片,用TP你就可以生成高清和普清的图片。

  • AlgorithmTexturePacker 支持的算法是 MaxRects,即按精灵尺寸大小排列;如果选择 Basic 则表示,当第一行排满之后再排到第二行。

  • Border/shape padding即在spritesheet里面,设置精灵与精灵之间的间隔。

  • Extrude精灵边界的重复像素个数。这个与间隔是相对应的--如果你的精灵旁边存在一些透明的小点,你可以通过把这个值设置大一点来解决。
  • Trim通过移除精灵四周的透明区域使之更好地被放在spritesheet中。不要担心,这些透明的区域仅仅是为了使 spritesheet 里面的精灵紧凑一点,当你从cocos2d 里面去读取这些精灵的时候,这些透明区域仍然存在。
  • Shape outlines把这个选项打开,那么就能看到精灵的边框。这在调试的时候非常有用。

对于spritesheet来说,上面的属性我们只需使用TP的默认值就好。我们只需要在输出时做些修改,讲解这个之前我们先了解下Cocos2d-x中的像素格式。

Cocos2d-x 和像素格式

在Cocos2d-x里面,理解像素格式非常重要。因为,像素格式会影响你在游戏中加载一张图片所需内存。游戏通常要加载大量的图片资源,尽可能充分利用移动设备上的可用物理内存对我们来说是很重要的。

默认情况下,当你在Cocos2d-x里面加载一张图片的时候,对于每一个像素点使用4个byte来表示。其中1个byte(8位)代表red,另外3个 byte分别代表green、blue和alpha透明通道。这个就简称RGBA8888。

因此,如果你使用默认的像素格式来加载图片的话,你可以通过下面的公式来计算出将要消耗多少内存:

图像宽度(width)×图像高度(height)×每一个像素的位数(bytes per pixel) = 内存大小

此时,如果你有一张512×512的图片,那么当你使用默认的像素格式去加载它的话,那么将耗费512×512×4=1MB

这里,我们以Iphone3G为例。它总共只有128兆内存,但是系统就要占掉一大半,还有其它一些程序也要使用一些内存,实际可用的内存就更少了。对于单独一张 spritesheet 来说那确实足够了,但是一个游戏通常会需要大量内存。

这里就需要让像素格式来帮忙了。为图片的每个像素点指定更小的字节来保存图片。(比如每个像素点2个字节,即每个像素点16位),这种方式就能够在图片质量和内存消耗之间取得一个很好的平衡点。

通常,你是在你的游戏看起来还 ok 的提前下,尽可能少地使用内存。背景图片就非常适合使用8位或者16位来存储,而精灵则一般要用16位或者32位。对于更多可选的像素格式和适用的场合,你可以参考Cocos2d的作者的一篇文章《understanding pixel format guide》(理解像素格式向导)。

btw,如果你注意看窗口的右下角,你会看到TexturePacker会基于你当前选择的像素格式计算出这张spritesheet所消耗的内存大小,因此你不必手动计算了。

像素格式和抖动

很多时候,当你使用较小的像素格式来加载图片的时候,你会发现图片的质量也在相应的降低。这时你会看到图像存在许多颜色的梯度变化。这里有一个例子,展示了当你使用像素格式RBGA4444去显示一张图片的时候会是什么样子:

看到没有,图像上面有许许多多的“条条”和颜色梯度变化,特别是熊和绿色的框框那里。这时,你可能想重新设计你的图片来确保使用更少的梯度,或者使用大一点的像素格式。但是,在这里,TexturePacker提供了另外一个杀手锏功能图像抖动。 当你使用TexturePacker来保存spritesheet的时候,你可以指定目标像素格式为RGBA4444,然后选择“dithering method”。这个默认选项会修改一些你的图像的颜色,但是当有梯度变化或者其它一些会带来问题的颜色以后,图像看起来就会非常糟糕。 继续,我们为spritesheet选择RBGA4444格式,然后改变抖动选项为“FloydSteinberg +Alpha”(下图红色框区域)。TexturePacker将会动态修改你的图片然后显示出效果来。

现在让我们保存这个spritesheet。点击工具栏顶端的“Save”,在弹出的对话框中选择 TextureFun\Resouces 目录,然后命名为“sprites-hd.pvr.ccz”。然后,TexturePack会自动为我们在Data file那里生成相应的plist文件路径。并且会命名为“sprites-hd.plist”,这个名字是根据前面你提要的名字来命名的。最后,点击“Publish”,TeturePacker会提示你一些精灵将会创建成红色(因为你使 用的是免费版本)。为什么使用pvr.ccz呢?

PVRs 和压缩

PVR 图像也可以包含许多种不同像素格式的图像数据。Cocos2d-x可以支持压缩了的 pvr图像格式pvr.ccz。使用这种图片格式的好处有两点:一、可以使你的应用程序更小,因为图片是压缩过了的。二、你的游戏能够启动地更快。 总而言之,对于 spritesheet 来说,你可能通过指定16位的像素格式来减少内存消耗,同时保存为pvr.ccz格式来使程序加载速度更快。

在Cocos2d-x里面使用SpriteSheet

现在回到我们之前创建好的-x项目,在Resources文件中加入我们刚刚生成好的文件sprites-hd.plistsprites-hd.pvr.ccz,接下来在HelloWorldScene.cppinit()方法中加入相应代码。源码放在github中可供下载

首先我们设置像素格式为RBGA4444(你为主精灵所使用的每个像素点16位的像素格式)

1
Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::RGBA4444);

接下来为这个spritesheet创建一个batch node。加载对应的pvr.ccz格式的文件和plist文件,然后把每一个精灵对应的帧(frame)也加载到精灵帧缓冲区(sprite frame cache)中。

1
2
3
4
5
Texture2D::setDefaultAlphaPixelFormat(Texture2D::PixelFormat::RGBA4444);
Texture2D *texture2D = Director::getInstance()->getTextureCache()->addImage( "sprites-hd.pvr.ccz" );
auto spBatchNode = SpriteBatchNode::createWithTexture(texture2D);
addChild(spBatchNode);
SpriteFrameCache::getInstance()->addSpriteFramesWithFile( "sprites-hd.pvr.plist" );
1
std::vector<std::string> arrSpFrameName = { "bear_2x2.png" , "bird.png" , "cat.png" , "dog.png" , "ooze_2x2.png" , "turtle.png" };

显示所有的图片。

5
6
7
8
for ( int i = 0;i< arrSpFrameName.size();i++){
std::string spFrameName = arrSpFrameName.at(i);
auto sp = Sprite::createWithSpriteFrameName(spFrameName);
float offsetFaction = (( float )(i+1)/(arrSpFrameName.size()+1));
Point spriteOffset = Point(visibleSize.width*offsetFaction,visibleSize.height/2);
sp->setPosition(spriteOffset);
addChild(sp);
}

最终显示的结果是:

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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在载入图片方面也有了非常大改变,仅仅只是