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

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

テクスチャアトラス

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

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

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

TextureLoader

画像のロードはゲームのツールキット毎に特有なため、TextureLoaderが画像の作成、廃棄を行います。ゲームツールキット用のランタイムにはそのゲームツールキット用のTextureLoaderが搭載されています。汎用ランタイムを使用する場合、自分でTextureLoaderを書く必要があり、これには2つのメソッドがあります:

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

loadメソッドはパスを使用して画像をロードし、AtlasPagerendererObjectフィールドを設定します。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レンダリングコードで使用されます。

JSONとバイナリデータ

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

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

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

AtlasAttachmentLoaderはアタッチメントのpath文字列を使用してテクスチャアトラス内の領域を発見し、その後レンダリングコードで使用するために、その領域にアタッチメントの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のスケールを使ってピクセルをメートルに変換することができます。

rootボーンのスケールを変更することで、単位に影響を与えずにスケーリングすることもできます:

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

この場合、ボーンのローカル位置が50,100であれば、その位置に留まります。しかし、ボーンのワールドトランスフォームが計算されると、その位置はスケーリングされます。ただし、そのスケルトンにスケールの継承を無効にしたボーンがある場合、うまくいかない可能性がありますのでご注意ください。

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