加载Skeleton数据
在应用程序中实现Spine动画的第一步是加载从Spine导出的texture atlas(纹理图集)和skeleton数据.
Texture Atlas(纹理图集)
Spine可以打包 texture atlas, 使Skeleton渲染更高效. 还可以用其他工具以Spine图集格式打包texture atlas, 例如"libgdx"格式的 Texture Packer Pro. Spine运行时使用如下代码来加载 texture atlas:
Atlas atlas = new Atlas("myAtlas.atlas", textureLoader);
创建texture atlas的过程中会解析atlas文本文件, 该文件包含在atlas页图片中区域(region)的位置信息. 它还会加载每个atlas页引用的图片文件.
TextureLoader
不同的游戏工具有不同的图片加载方式, 因此使用TextureLoader来创建和销毁图片. 不同的运行时都有其对应的TextureLoader. 但如果使用通用运行时时, 则需要自己编写TextureLoader, 必须包含以下两种基本方法:
void unload (Object rendererObject)
load
方法从文件路径加载一张图片, 并在AtlasPage上设置rendererObject
字段. unload
方法用于销毁已加载的图片. 例如, 这是加载某个运行时中Texture的示例:
Texture texture = GameToolkit.loadTexture(path);
page.rendererObject = texture;
}
void unload (Object rendererObject) {
Texture texture = (Texture)rendererObject;
texture.dispose();
}
渲染代码将使用 AtlasPage 上的rendererObject
字段.
JSON和二进制数据
使用SkeletonJson或SkeletonBinary可以加载JSON或二进制skeleton数据. JSON是人类可读的, 但是文件较大, 解析较慢. 二进制很小很快, 但是人类不可读. SkeletonJson和SkeletonBinary都包含一个返回 SkeletonData 的 readSkeletonData
方法.
创建SkeletonJson或SkeletonBinary实例需要指定一个AttachmentLoader, 它包含返回新附件实例的方法. AttachmentLoader提供了一种在加载时自定义附件的方式, 例如可以设置附件的atlas区域以便稍后渲染. 这个功能十分常用, 所以Spine运行时也自带了一个功能完全相同的AtlasAttachmentLoader:
SkeletonJson json = new SkeletonJson(attachmentLoader);
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");
AtlasAttachmentLoader使用附件的path
字符串来查找texture atlas中的区域, 然后将该区域填入附件的rendererObject
字段以供渲染代码稍后使用.
AttachmentLoader
高级用户可能不会使用AtlasAttachmentLoader, 而是自己手搓AttachmentLoader, 这种AttachmentLoader需要为每种附件类型实现对应的方法:
MeshAttachment newMeshAttachment (Skin skin, String name, String path)
BoundingBoxAttachment newBoundingBoxAttachment (Skin skin, String name, String path)
PathAttachment newPathAttachment (Skin skin, String name, String path)
至少应创建和返回每种类型(或其子类)的新附件, JSON或二进制文件将指定这些附件的使用细节. 如果方法返回null, 附件将被视为完全不存在于数据而被忽略.
对于区域和网格附件, 可将rendererObject
字段设置为任何渲染代码所需的对象, 虽然这是可选的. 例如, 将skeleton数据用于非渲染用途并且无需加载任何图片. 或者你可能有数千个附件, 因此无法在加载skeleton数据时加载所有图片. 这时可推迟图片加载直到实际要用附件的时候.
在渲染前, 必须设置rendererObject
及一些关于atlas区域的属性, 例如UV、白边去除(whitespace stripped)区域尺寸、原始图片尺寸, 以及区域是否被纹理打包器旋转了90度等. 有关设置这些属性的例子, 可参考所选运行时的AtlasAttachmentLoader源代码。
缩放
在加载skeleton数据后, SkeletonJson或SkeletonBinary类可缩放骨骼的位置、图片尺寸及运动位移:
json.scale = 2;
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");
该功能可以不同尺寸绘制skeleton, 该例中是两倍放大. 如果使用了与skeleton尺度不一的图片时缩放功能会怕派上大用. 例如, 若使用的图片只有Skeleton附件尺寸的一半大时, 可选择使用0.5倍缩放. 一些游戏包含不同尺寸的texture atlas, 可根据玩家屏幕分辨率灵活选择.
加载器(loader)缩放比例用于更改单位, 例如, 若某根骨骼的本地位置是50,100, 那么使用2倍缩放可在加载时将位置改为100,200. 没在运行时中使用像素单位比例的话会很有用. 例如, Box2D偏向于使用米, 所以用0.01倍比例可将像素转换成米制单位.
也可通过缩放根骨骼来缩放skeleton, 这样不会影响单位:
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");
BoneData root = skeletonData.findBone("root");
root.scaleX = 2;
root.scaleY = 2;
在此例中, 如果一个骨骼的本地位置是50,100, 则该位置将保持不变. 但在计算该骨骼的世界变换时会缩放该位置. 如果skeleton中包含禁用了继承比例的骨骼时, 该功能可能无法生效.