スケルトンデータのロード

Spineアニメーションをあなたのアプリケーションに移す最初のステップは、Spineからexportedされたテクスチャアトラスとスケルトンデータをロードすることです。

テクスチャアトラス

Spineはスケルトンを効率的にレンダリングするためにテクスチャアトラスをpack します。他のツールもSpineアトラスフォーマットでテクスチャアトラスをパックするために使用できます。"libgdx"アトラスフォーマットを使用するTexture Packer Proがその例です。Spine Runtimesは以下を使用することでアトラスをロードします:

TextureLoader textureLoader = ...
Atlas atlas = new Atlas("myAtlas.atlas", textureLoader);

アトラスを作成すると、アトラスページ画像内にどこに領域が存在するかを示すアトラステキストファイルを解析します。各アトラスページの画像ファイルもロードします。

TextureLoader

画像のロードはゲームのツールキットに特有なため、TextureLoaderが画像を作成し、配置します。ゲームツールキット用のRuntimesにはそのゲームツールキット用のTextureLoaderが搭載されています。一般的なランタイムを使用する時、自分のTextureLoaderを書く必要があり、これには2つの方法があります:

void load (AtlasPage page, String path)
void unload (Object rendererObject)

「load」メソッドはパスを使用して画像をロードし、AtlasPage上のフィールドに「endererObject」を設定します。「unload」メソッドは以前にロードされた画像を処分します。例えば、ここでのTextureはゲームツールキットタイプです:

void load (AtlasPage page, String path) {
   Texture texture = GameToolkit.loadTexture(path);
   page.rendererObject = texture;
}

void unload (Object rendererObject) {
   Texture texture = (Texture)rendererObject;
   texture.dispose();
}

AtlasPageの「rendererObject」がrendering codeにより使用されます。

JSONとバイナリデータ

JSONまたはバイナリスケルトンデータのロードはSkeletonJsonまたはSkeletonBinaryを使用して実行します。JSONは人間が判読可能ですが、ファイルサイズが大きく解析に時間が掛かります。バイナリはサイズが小さく迅速ですが人間が判読できません。SkeletonJsonとSkeletonBinaryは両方ともSkeletonDataを返す「readSkeletonData」メソッドを持っています。

SkeletonJsonまたはSkeletonBinaryインスタンスの作成は、新しいアタッチメントインスタンスを返す方法を持つAttachmentLoaderの指定を必要とします。AttachmentLoaderは、アタッチメントのアトラス領域を後のレンダリングに設定するなど、アタッチメントのロード時にアタッチメントをカスタマイズする方法を提供します。これは頻繁に行われるため、Spine Runtimesはこれを実行するAtlasAttachmentLoaderを搭載します:

AtlasAttachmentLoader attachmentLoader = new AtlasAttachmentLoader(atlas);
SkeletonJson json = new SkeletonJson(attachmentLoader);
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");

AtlasAttachmentLoaderはアタッチメントの「path」ストリングを使用してテクスチャアトラスに領域を発見し、後にrendering codeに使用させるために、その領域にアタッチメントの「rendererObject」フィールドを設定します。

AttachmentLoader

上級ユーザーはAtlasAttachmentLoaderを使用する代わりに、各アタッチメントタイプにメソッドを持つ自身のAttachmentLoaderを指定することを望むかもしれません:

RegionAttachment newRegionAttachment (Skin skin, String name, String path)
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」フィールドを必要なオブジェクトに設定することが可能です。例えば、レンダリング以外の目的にスケルトンを使用し、画像をロードする必要がない時があります。また数千個のアタッチメントがあり、スケルトンデータをロードする時、全ての画像をロードすることが不可能な場合があります。このようなケースでは、実際に使用するアタッチメントを特定するまで画像のロードを待つほうがよいでしょう。

レンダリングする前に「rendererObject」およびアトラス領域の幾つかの属性、例えばUV、空白除去領域サイズ、元の画像サイズ、テクスチャパッカーにより領域が90度回転される場合等を設定する必要があります。これらの属性の設定例は、ご使用のランタイム向けのAtlasAttachmentLoaderソースをご参照ください。

スケーリング

スケルトンデータがロードされる時、SkeletonJsonまたはSkeletonBinaryクラスはボーンポジション、画像サイズ、およびトランスレーションのスケールを決定します:

SkeletonJson json = new SkeletonJson(attachmentLoader);
json.scale = 2;
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");

これによりスケルトンが様々なサイズで描画されます。この例では2倍の大きさで描画されます。スケーリングはSpineでデザインした時のスケルトンとは異なる様々なサイズの画像を使用する時便利です。Spineで使用されたサイズの半分のサイズの画像が必要な時は0.5スケールが使用されます。あるゲームでは、異なるサイズのテクスチャアトラスが含まれ、プレーヤーのスクリーンの解像度によりサイズが選択されます。

ローダースケールの使用は使用単位を変更します。例えばボーンが50、100というローカルポジションを持つ場合、2スケールによりこれらはロード時に100、200に変更されます。ランタイム時に画素単位のスケールを使用しない時便利です。例えば、Box2Dはメートルを好むため、0.01のスケールは画素をメートルに変換できます。

ルートボーンのスケールを変更することで、単位を影響せずにスケルトンのスケールを変更することができます:

SkeletonJson json = new SkeletonJson(attachmentLoader);
SkeletonData skeletonData = json.readSkeletonData("mySkeleton.json");
BoneData root = skeletonData.findBone("root");
root.scaleX = 2;
root.scaleY = 2;

この場合、ボーンは50、100というローカルポジションを持ち、このポジションを維持します。しかしボーンのワールドトランスフォームが計算される時、このポジションのスケールが変更されます。スケルトンがスケール継承を無効にするボーンを持つ場合、希望通りに実行されないことがあります。

次: アニメーションの適用 前: ランタイムアーキテクチャ