使用一个纹理贴图集

如果你正在处理一个很大的,很复杂的游戏,你想要找到一种快速有效的方式来从雪碧图创建精灵。纹理贴图集 就会显得很有用处,一个纹理贴图集就是一个JSON数据文件,它包含了匹配的PNG雪碧图的子图像的大小和位置。如果你使用了纹理贴图集,那么想要显示一个子图像只需要知道它的名字就行了。你可以任意的排序你的排版,JSON文件会保持他们的大小和位置不变。这非常方便,因为这意味着图片的位置和大小不必写在你的代码里。如果你想要改变纹理贴图集的排版,类似增加图片,修改图片大小和删除图片这些操作,只需要修改那个JSON数据文件就行了,你的游戏会自动给程序内的所有数据应用新的纹理贴图集。你没必要在所有用到它代码的地方修改它。

Pixi兼容著名软件Texture
Packer
输出的标准纹理贴图集格式。Texture Packer的基本功能是免费的。让我们来学习怎么用它来制作一个纹理贴图集,并把它加载进Pixi吧!(你也不是非得用它,还有一些类似的工具输出的纹理贴图集Pixi也是兼容的,例如:Shoeboxspritesheet.js。)

首先,从你要用在游戏的图片文件们开始。

图片文件

在这个章节所有的图片都是被Lanea Zimmerman创作的。你能在他的艺术工作室里面找到更多类似的东西:这里,谢谢你,Lanea!

下面,打开Texture Packer,选择 JSON Hash 框架类型。把你的图片放进Texture Packer的工作区。(你也可以把Texture Packer放进包含你图片的文件夹里面去。)他将自动的把你的图片们生成单个图片文件,并且将他们的原始名称命名为纹理贴图集中的图片名称。

图片文件

如果你正在用免费版的Texture Packer,把 Algorithm 选项设为Basic,把 Trim mode 选项设为None,把 Extrude 选项设为0,把 Size constraints 选项设为 Any size ,把 PNG Opt Level 中所有的东西都滑到左边的 0位置。这就可以使得Texture Packer正常的输出你的纹理贴图集。

如果你做完了,点击 Publish 按钮。选择输出文件名和存储地址,把生成文件保存起来。你将会获得两个文件:一个叫做treasureHunter.json,另外一个就是treasureHunter.png。为了让目录干净些,我们把他俩都放到一个叫做images的文件夹里面去。(你可以认为那个json文件是图片文件的延伸,所以把他们放进一个文件夹是很有意义的。)那个JSON文件里面写清楚了每一个子图像的名字,大小和位置。下面描述了“泡泡怪”这个怪物的子图像的信息。

  1. "blob.png":
  2. {
  3. "frame": {"x":55,"y":2,"w":32,"h":24},
  4. "rotated": false,
  5. "trimmed": false,
  6. "spriteSourceSize": {"x":0,"y":0,"w":32,"h":24},
  7. "sourceSize": {"w":32,"h":24},
  8. "pivot": {"x":0.5,"y":0.5}
  9. },

treasureHunter.json里面也包含了“dungeon.png”,
“door.png”, “exit.png”, 和 “explorer.png”的数据信息,并以和上面类似的信息记录。这些子图像每一个都被叫做 ,有了这些数据你就不用去记每一个图片的大小和位置了,你唯一要做的就只是确定精灵的 帧ID 即可。帧ID就是那些图片的原始名称,类似”blob.png”或者 “explorer.png”这样。

使用纹理贴图集的巨大优势之一就是你可以很轻易的给每一个图像增加两个像素的内边距。Texture Packer默认这么做。这对于保护图像的 出血(译者:出血是排版和图片处理方面的专有名词,指在主要内容周围留空以便印刷或裁切)来说很重要。出血对于防止两个图片相邻而相互影响来说很重要。这种情况往往发生于你的GPU渲染某些图片的时候。把边上的一两个像素加上去还是不要?这对于每一个GPU来说都有不同的做法。所以对每一个图像空出一两个像素对于显示来说是最好的兼容。

(注意:如果你真的在每个图像的周围留了两个像素的出血,你必须时时刻刻注意Pixi显示时候“丢了一个像素”的情况。尝试着去改变纹理的规模模式来重新计算它。texture.baseTexture.scaleMode = PIXI.SCALE_MODES.NEAREST;,这往往发生于你的GPU浮点运算凑整失败的时候。)

现在你明白了怎么创建一个纹理贴图集,来学习怎么把他加载进你的游戏之中吧。