読者です 読者をやめる 読者になる 読者になる
「 s e a r c h 」 ら へ ん へ い く ボ タ ン

Spriter2dX導入ログ

低機能版が無料の2D skeletal animation編集ソフト。公式でC++がサポートされている*1Cocos2d-xに対応させたAPIを作ってくれた人がいる。しかし導入にそこそこ手こずった。Macでビルドできることを確かめたがiOSでもたぶん大体同じ。まずはSpriterPlusPlusの静的ライブラリを作る。そのあとそれを使ってSpriter2dXのexampleを動かしてみる。

SpriterPlusPlusビルド

GitHubからダウンロードしてくる。

lucidspriter/SpriterPlusPlus: a C++ implementation to play back Spriter animations

cd ~/Desktop
git clone https://github.com/lucidspriter/SpriterPlusPlus.git

プロジェクトのルートディレクトリで、

cmake -G Xcode spriterengine
open SPRITER_ENGINE.xcodeproj

ターゲットからspriterengineを選択し、Releaseビルドに設定する。 左上のターゲット選択欄 → Edit Scheme → Run → Infoタブ → Build configurationでReleaseを選択。とりあえずBuildしてみる。エラー。

/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/animation/animationinstance.h:75:15: Implicit instantiation of undefined template 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/animation/animation.h:50:15: Implicit instantiation of undefined template 'std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >'

animationinstance.hとanimation.hの先頭に #include <string>を追加してみる。エラーの内容が変わった。通ったらしい。

/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/model/spritermodel.cpp:19:3: Delegating constructors are permitted only in C++11

C++11の設定になっていなかったらしい。 ターゲットspriterengine → Build Settings→ Apple LLVM 7.0 - Language - C++ → C++ Language DialectC++11 [-std=c++11]に変更する。ビルド成功。25個ほどwarningが出ていた。一応メモしておく。

spriterengine Group
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstancedata.h
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstancedata.h:79:8: 'SpriterEngine::EntityInstanceData::setCurrentAnimation' hides overloaded virtual functions
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstancedata.h:80:8: 'SpriterEngine::EntityInstanceData::setCurrentAnimation' hides overloaded virtual functions
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.h
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.h:76:16: 'SpriterEngine::EntityInstance::getRealValue' hides overloaded virtual function
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.h:77:15: 'SpriterEngine::EntityInstance::getIntValue' hides overloaded virtual function
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.h:78:23: 'SpriterEngine::EntityInstance::getStringValue' hides overloaded virtual function
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.h:80:16: 'SpriterEngine::EntityInstance::getRealValue' hides overloaded virtual function
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.h:81:15: 'SpriterEngine::EntityInstance::getIntValue' hides overloaded virtual function
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.h:82:23: 'SpriterEngine::EntityInstance::getStringValue' hides overloaded virtual function
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/object.cpp
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/object.cpp:30:3: Field 'objectId' will be initialized after field 'objectType'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:27:3: Field 'playbackSpeedRatio' will be initialized after field 'blendCurrentTime'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:28:3: Field 'blendCurrentTime' will be initialized after field 'blendTotalTime'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:29:3: Field 'blendTotalTime' will be initialized after field 'blendedAnimation'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:30:3: Field 'blendedAnimation' will be initialized after field 'isPlaying'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:43:3: Field 'playbackSpeedRatio' will be initialized after field 'blendCurrentTime'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:44:3: Field 'blendCurrentTime' will be initialized after field 'blendTotalTime'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:45:3: Field 'blendTotalTime' will be initialized after field 'blendedAnimation'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:46:3: Field 'blendedAnimation' will be initialized after field 'isPlaying'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/entity/entityinstance.cpp:724:23: Unused variable 'newEntityData'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/model/spritermodel.cpp
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/model/spritermodel.cpp:26:3: Field 'objectFactory' will be initialized after field 'loader'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/loading/spriterdocumentloader.cpp
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/loading/spriterdocumentloader.cpp:466:11: Unused variable 'entity'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/loading/spriterdocumentloader.cpp:697:14: Unused variable 'newAnimation'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/loading/spriterdocumentloader.cpp:1053:11: Unused variable 'object'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/override/soundobjectinforeference.cpp
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/override/soundobjectinforeference.cpp:9:3: Field 'triggerCount' will be initialized after field 'volume'
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/timeline/timelinekey.cpp
/Users/rapmocha/Desktop/SpriterPlusPlus/spriterengine/timeline/timelinekey.cpp:14:3: Field 'time' will be initialized after field 'objectInfo'

このほかにも tinyxml2のインストールとかしたような気もする。

brew install tinyxml2

とりあえず以上でReleaseディレクトリにlibspriterengine.aが生成された。これを使ってSpriter2dXを動かす。

Spriter2dX example を動かす

exampleをGitHubからダウンロードし、Xcodeプロジェクトを開く。

jeremyjh/Spriter2dX-example: Example using Spriter2dX - a Spriter implementation for Cocos2d-X

cd ~/Desktop
git clone https://github.com/jeremyjh/Spriter2dX-example.git
open proj.ios_mac/Spriter2dx-example.xcodeproj/
  1. ターゲットはdesktopにしておく。
  2. cocos2d_libs.xcodeprojは削除してしまって、以前作ったライブラリ libcocos2d Mac.aをFrameworkグループにD&D。
  3. さっき作ったライブラリ libspriterengine.aも同様にD&D。

とりあえずビルド。エラー。

/Users/rapmocha/Desktop/Spriter2dX-example/proj.ios_mac/mac/Prefix.pch:10:11: 'cocos2d.h' file not found

適当なcocos2dプロジェクトから cocos2dディレクトリをコピー。ビルド。

/Users/rapmocha/Desktop/Spriter2dX-example/Classes/HelloWorldScene.cpp:2:10: 'AnimationNode.h' file not found

Spriter2dX本体が必要だった。ダウンロードしてきて、 srcディレクトリをコピー。

jeremyjh/Spriter2dX at 143b2c2a4ba58e59046447e5c971f63c71630618

cd ~/Desktop
git clone https://github.com/jeremyjh/Spriter2dX.git
cp -r src ../Spriter2dX-example/external/Spriter2dX/

ターゲットdesktop → Build Settings → Search Paths → Header Search Paths$(SRCROOT)/../external/Spriter2dX/srcを追加。 externalディレクトリをD&Dでプロジェクトに追加。ビルド。

/Users/rapmocha/Desktop/Spriter2dX-example/proj.ios_mac/external/Spriter2dX/src/ccobjectfactory.h:5:10: '../SpriterPlusPlus/spriterengine/override/objectfactory.h' file not found

SpriterPlusPlusのヘッダも必要だった。

cp -r ~/Desktop/SpriterPlusPlus external/Spriter2dX

ビルド。エラー。

/Users/rapmocha/Desktop/Spriter2dX-example/proj.ios_mac/external/Spriter2dX/src/ccfilefactory.h:16:120: Non-virtual member function marked 'override' hides virtual member function

override指定子を取り除く…。ビルド、エラー。

/Users/rapmocha/Desktop/Spriter2dX-example/proj.ios_mac/external/Spriter2dX/src/tinyxmlspriterfiledocumentwrapper.h:4:10: 'tinyxml2.h' file not found

Header Search Paths/usr/local/includeを追加。

tinyxml2::XMLAttribute::Name() const, referenced from:
…
tinyxml2::XMLAttribute::Value() const, referenced from:
…
tinyxml2::XMLNode::Value() const, referenced from:
…
clang: error: linker command failed with exit code 1 (use -v to see invocation)

tinyxml2のライブラリをリンクできなかったらしい。desktopターゲット → Build Phases → Link Binary with Librariesで、libtinyxml.dylibを追加。

これでビルド成功。warningがいっぱい。recommend settingsを適用し、 desktopターゲット → Deployment Info → Deployment Targetで適したOSXのバージョンを選んだらなくなった。

このまま実行するとクラッシュ。プロジェクトに画像などのResourceを読み込んでいなかったから。GreyGuyディレクトリがResourceディレクトリに入っているので、ResourceグループにD&Dでfolder referenceとして読み込む。

これで落ちない。表示される。と思いきやできない。落ちたりしないが、真っ黒。なぜ。

どうやら、override指定子のコンパイルエラーへの対処がまずかったらしい。 overrideは復活させる。エラーになっているのは、宣言が基底クラスのシグネチャに一致しないため。エラー箇所は ccfilefactory.h

SpriterEngine::ImageFile *newImageFile(const std::string& initialFilePath, SpriterEngine::point initialDefaultPivot) override;

だが、この基底クラスSpriterEngine::FileFactorynewImageFile

virtual ImageFile *newImageFile(const std::string &initialFilePath, point initialDefaultPivot, atlasdata atlasData);

引数が足りてない。SpriterEngine::atlasdata atrasDataを加える。これに伴ってccfilefactory.cppの実装部分も変更。これでコンパイルが通るようになった。さらに実行するとアニメーションが表示される。とりあえず一件落着。

f:id:rapmocha:20161020132924p:plain