spine-sdlランタイムドキュメント
ライセンスについて
Spineランタイムをアプリケーションに組み込む前に、必ずSpine Runtimes Licenseを確認してください。
はじめに
インストール方法
spine-sdl ランタイムは C および C++ API として利用できます。C API は汎用spine-cランタイムをベースにしており、C++ API は汎用 spine-cppランタイムをベースにしています。spine-sdl をプロジェクトに統合するには:
- まず新しいSDLプロジェクトを作成します。 詳しくはSDLの公式ドキュメントを参照するか、spine-runtimesリポジトリにあるCMake をビルドシステムとして利用しているサンプルをご覧ください。
- gitを利用してSpineランタイムのソースをダウンロードします (
git clone https://github.com/esotericsoftware/spine-runtimes)。 - Cを利用している場合:
spine-c/spine-c/src/spine内のソースとspine-sdl/src/spine-sdl-c.cファイルを作成したプロジェクトに追加します。spine-c/spine-c/includeフォルダとspine-sdl/src/フォルダをヘッダーサーチパスに追加します。
- C++を利用している場合:
spine-cpp/spine-cpp/src/spine内のソースとspine-sdl/src/spine-sdl-cpp.cppファイルを作成したプロジェクトに追加します。spine-cpp/spine-cpp/includeフォルダとspine-sdl/srcフォルダをヘッダーサーチパスに追加します。
C または C++ コードでは、以下のヘッダーファイルのいずれかをインクルードして spine-sdl APIにアクセスしてください:
#include <spine-sdl-c.h>
// C++ API
#include <spine-sdl-cpp.h>
注意: spine-sdlを利用するには
SDL_RenderGeometryAPIが必要です。これは SDL 2.0.18 以降で使用できます。そのため、SDLの古いバージョンはspine-sdlと互換性がありません。
サンプル
spine-sdlのサンプルは、Windows、Linux、Mac OS X で動作します。spine-c ベースの例については example/main.c を、 spine-cpp ベースの例については example/main.cpp を参照してください。
Windows
- Visual Studio Communityをインストールします。その際、C++サポートもインストールしてください。
- WindowsインストーラーパッケージからCMakeをインストールします。
- git (
git clone https://github.com/esotericsoftware/spine-runtimes)を使ってSpine Runtimesリポジトリをダウンロードするか、上部のダウンロードボタンからzip形式でダウンロードしてください。 - スタートメニューからCMake GUIを実行します。
Browse Sourceをクリックして、spine-runtimesディレクトリを選択します。Browse Buildをクリックして、spine-runtimes/spine-sdl/buildディレクトリを選択します。ファイルダイアログのNew Folderから直接buildフォルダを作成できます。Configureをクリックします。次にGenerateをクリックします。するとspine-runtimes/spine-sdl/buildにspine.slnという Visual Studio ソリューション ファイルが作成され、SDLの依存関係もダウンロードされます。- Visual Studioで
spine.slnファイルを開きます。 - ソリューション・エクスプローラーで
spine-sdl-example-cまたはspine-sdl-example-cppプロジェクトを右クリックし、コンテキスト・メニューからSet as Startup Projectを選択します。 Local Windows Debuggerをクリックしてサンプルを実行します。
コード例全体はmain.cppに含まれています。
Linux
- SDL build dependenciesをインストールします。
- git (
git clone https://github.com/esotericsoftware/spine-runtimes)を使ってSpine Runtimesリポジトリをダウンロードするか、上部のダウンロードボタンからzip形式でダウンロードしてください。 - ターミナルを開いて、
cdでspine-runtimes/spine-sdlフォルダに移動します。 mkdir build && cd build && cmake ../..と入力してMakeファイルを生成します。makeと入力してサンプルをコンパイルします。cd spine-sdl && ./spine-sdl-c-example(C) またはcd spine-sdl && ./spine-sdl-cpp-example(C++) と入力してサンプルを実行します。
Mac OS X
- まずXcodeをインストールします。
- Homebrewをインストールします。
- ターミナルを開いて、
brew install cmakeと入力してCMakeをインストールします。 - git (
git clone https://github.com/esotericsoftware/spine-runtimes)を使ってSpine Runtimesリポジトリをダウンロードするか、上部のダウンロードボタンからzip形式でダウンロードしてください。 - ターミナルを開いて、
cdでspine-runtimes/spine-sdlフォルダに移動します。 mkdir build && cd build && cmake ../..と入力してMakeファイルを生成します。makeと入力してサンプルをコンパイルします。cd spine-sdl && ./spine-sdl-c-example(C) またはcd spine-sdl && ./spine-sdl-cpp-example(C++) と入力してサンプルを実行します。
spine-sdlを使用する
spine-sdlランタイムは、SDLでSpineで作成されたアニメーションの再生と操作を行うことをサポートします。spine-sdl ランタイムは、汎用spine-cおよび汎用spine-cppランタイムをベースにした C および C++ の実装です。また、SDL API に基づいたローディングとレンダリングの実装も追加されています。
Spineランタイムのアーキテクチャの詳細についてはSpineランタイムガイドを、Spineで作成されたアニメーションの再生と操作に使用されるCおよびC++のコアAPIについてはspine-cおよび spine-cppのドキュメントを参照してください。
SDL用にエクスポートする
以下の実行方法については、Spineユーザーガイド内で紹介されています :
スケルトンのデータとテクスチャアトラスをエクスポートすると、以下のファイルが得られます:

skeleton-name.jsonまたはskeleton-name.skel: これはスケルトンとアニメーションのデータを含んでいます。skeleton-name.atlas: これはテクスチャアトラスの情報を含んでいます。- 1つまたは複数の
.pngファイル: これはテクスチャアトラスの各ページで、スケルトンが使用するイメージを含んでいます。
注意: spine-sdlランタイムは、Spineエディターで利用可能な2色カラーティントとスクリーンブレンドモードをサポートしていないので注意してください。
Spineスケルトンのローディング
spine-sdlランタイムは、SDL_Renderer APIを使用してスケルトンを表示します。そのため、エクスポートされたファイルからスケルトンをロードする前に、以下のように SDL_Renderer を作成する必要があります:
次に、テクスチャアトラスは、C APIでは次のようにロードできます:
spAtlas *atlas = spAtlas_createFromFile("data/spineboy.atlas", renderer);
C++ APIでは SDLTextureLoader が必要です:
spine::SDLTextureLoader textureLoader(renderer);
spine::Atlas atlas("data/spineboy.atlas", &textureLoader);
アトラスがロードされたら、C API では .json または .skel ファイルを次のようにロードすることができます:
spSkeletonJson *json = spSkeletonJson_create(atlas);
spSkeletonData *skeletonData = spSkeletonJson_readSkeletonDataFile(json, "data/spineboy-pro.json");
spSkeletonJson_dispose(json);
C++ APIではスケルトンファイルのロードは次のように行います:
spine::AtlasAttachmentLoader attachmentLoader(&atlas);
spine::SkeletonJson json(&attachmentLoader);
spine::SkeletonData *skeletonData = json.readSkeletonDataFile("data/spineboy-pro.json");
spAtlas/spine::Atlas と spSkeletonData/spine::SkeletonData インスタンスを使用して spSkeletonDrawable/spine::SkeletonDrawable インスタンスを作成し、スケルトンデータをレンダリングできます。
補足: ロードしたスケルトンデータとアトラスは、
spSkeletonDrawable/spine::SkeletonDrawableインスタンス間で共有することができます。これによりメモリ消費量を削減し、同じアトラスデータを共有するスケルトンの一括レンダリングが可能になります。
Skeleton drawable
spine-c および spine-cpp の上に追加されたspine-sdlの主な機能は、スケルトンの描画機能です。これは spSkeleton (C API) または spine::Skeleton (C++ API) を保持し、スケルトンのボーン、スロット、アタッチメント、コンストレイントなどを保存し、spAnimationState (C API) または spine::AnimationState がスケルトンのアニメーションを管理します。Skeleton drawable には、AnimationStateの更新、スケルトンへの適用、スケルトンの更新、 SDL_Renderer を使用したスケルトンの描画を行うメソッドが用意されています。
C APIを使用する場合は、以下のようにして Skeleton drawable を作成することができます:
spAnimationStateData *animationStateData = spAnimationStateData_create(skeletonData);
spSkeletonDrawable *drawable = spSkeletonDrawable_create(skeletonData, animationStateData);
spAnimationStateData はアニメーション間のミックス時間を保存し、内部の spAnimationState を構築するために必要です。詳しくは spine-c のドキュメントを参照してください。
C++ APIの場合、Skeleton drawable の作成は次のように行います:
spine::SkeletonDrawable drawable(skeletonData);
ミックス時間を複数のdrawable間で共有したい場合、オプションで spine::AnimationStateData を spine::SkeletonDrawable コンストラクタに渡すこともできます。詳しくは spine-cpp のドキュメントを参照してください。
Skeleton drawable が作成されると、それに含まれるスケルトンとAnimationStateのインスタンスにアクセスして操作できるようになります。
drawable->skeleton->x = 400;
drawable->skeleton->y = 500;
spSkeleton_setToSetupPose(drawable->skeleton);
spAnimationState_setAnimationByName(drawable->animationState, 0, "portal", 0);
spAnimationState_addAnimationByName(drawable->animationState, 0, "run", -1, 0);
C++の場合:
drawable.skeleton->setPosition(400, 500);
drawable.skeleton->setToSetupPose();
drawable.animationState->setAnimation(0, "portal", true);
drawable.animationState->addAnimation(0, "run", true, 0);
スケルトンやAnimationStateを操作するAPIの詳細についてはspine-cおよびspine-cppのドキュメントを参照してください。
Skeleton drawableは、スケルトンとAnimationStateを簡単に更新するメソッドも提供しています:
spSkeletonDrawable_update(drawable, deltaTimeInSeconds);
// C++ API
drawable.update(deltaTimeInSeconds);
updateメソッドは、最後のフレームと現在のフレームとの間の差分時間(秒)を取り、AnimationStateを更新し、AnimationStateをスケルトンに適用し、最後にスケルトンのワールドトランスフォームを更新します。
AnimationStateとスケルトンが更新されたら、以下のようにしてそれを描画することができます:
spSkeletonDrawable_draw(drawable, renderer);
// C++ API
drawable.draw(renderer);
Skeleton drawableが不要になったら、以下のようにしてメモリーを解放してください:
spSkeletonDrawable_dipose(drawable);
// C++ API, if the drawable was allocated on the heap via new
delete drawable;
注意: Skeleton drawableを解放しても、そこから作成されたスケルトン データとアトラスは解放されません。スケルトン データとアトラスは、それぞれの API (Cの場合は
spSkeletonData_dipose(skeletonData)/spAtlas_dispose(atlas)、C++の場合はdelete)を使って個別に解放する必要があります。