Cocos2d-x
空っぽ環境を作ろう
(2015. 1. 19)
Hello Worldサンプルから不必要な所を取り除いて空っぽの環境を作ってみます。
@ 既存コードのシェイピング
まずmain.hとmain.cppですが、これはコード内にプロジェクト依存な記述が無いのでそのまま使えそうです。AppDelegate.hとAppDelegate.cppはどうでしょう。このクラスはアプリケーションの初期化を行うと共に「アプリケーションの初期化が終わった時」「アプリケーションがバックグラウンドに移行した時」「アプリケーションがフォアグラウンドに戻ってきた時」それぞれのコールバックを実装しています。これらは必須実装のようなので、AppDelegate.hも使い回しOKですね。
で、AppDelegate.cppですが、一つだけプロジェクト依存コードが含まれています:
AppDelegate.cpp bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
director->setOpenGLView(glview);
}
// turn on display FPS
director->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
auto scene = HelloWorld::createScene();
// run
director->runWithScene(scene);
return true;
}
もし新しいゲームを作ろうとした時、上の太文字部分を書きかえると共に、実装をHelloWorldと合わせstaticメソッドを作っておく必要があります。それは正直嫌です。だって、ここでやりたいのは「何かのシーンをDirectorに登録して動かし始める」ですよね。であれば太文字の部分はファクトリにして、そのファクトリ内でシーンを作るようにすれば、AppDelegate.cppももう触らなくて良いコードになります:
AppDelegate.cpp(シーン生成をファクトリ化) bool AppDelegate::applicationDidFinishLaunching() {
// initialize director
auto director = Director::getInstance();
auto glview = director->getOpenGLView();
if(!glview) {
glview = GLViewImpl::create("My Game");
director->setOpenGLView(glview);
}
// turn on display FPS
director->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
director->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
auto scene = WakeUpSceneFactory::create();
// run
director->runWithScene(scene);
return true;
}
太文字の所のようにWakeUpSceneFactoryというファクトリクラスを新設します。staticなcreateメソッドを持っていて、その中で具体的なファーストシーンを作成します。もし別のゲームを作る時にはWakeUpSceneFactory.cppだけ書き換える事になると思います。
HelloWorld.hと.cppですが、これはLayerクラスを継承しています。Layerは多分シーンにぶら下がる物の一つでしょうから、これ、ばっさり無くしてもきっと動くんじゃないかなと予想します(^-^;。なので、プロジェクトから省いてしまいましょう。
と言う事で、空っぽ環境は以下のような構成になりそうです:
A 空っぽのWakeUpSceneFactoryを作って動かしてみる
空っぽアプリを作るべく、ダミーのWakeUpSceneFactoryクラスを作成してみます。実装はこんな感じです:
WakeUpSceneFactory.h #include "cocos2d.h"
class WakeUpSceneFactory {
public:
static cocos2d::Scene *create();
};
WakeUpSceneFactory.cpp #include "WakeUpSceneFactory.h"
USING_NS_CC;
cocos2d::Scene* WakeUpSceneFactory::create() {
auto scene = Scene::create();
return scene;
}
シンプル(^-^)。これらクラスは自分の開発環境のルートフォルダにClassesというフォルダがありますので、そこに入れるのがCocos2d-x流のようです(もちろん別にしても構いません)。USING_NS_CCというマクロがありますが、これは単にネームスペースを定義しているだけでした。まぁこれもCocos2d-xの流儀に従っておきます。こういうのは抗うと大抵後でメンドクサイ事になります。
上のコードをプロジェクトに追加して、HelloWorld.hと.cppを除き、アプリをビルドすると次のような画面になりました:
HelloWorldサンプルで出ていた各MenuItemは全部無くなりました。ただ左下にFPS計測値が出ています。これ、どこで描画しているのかを突き止めてみます。空っぽ環境までもう一歩(^-^)
B FPS計測描画を消す
左下のFPS計測描画。これDebug版だけなんだろうなぁと思いRelease版を作ってみたのですが消えませんでした(^-^;。どこかでガッツリ描画しているようです。さすがに製品にそれが入る訳は無いので、これを消してみます。…というものの、見るべき所は一つしかありません。AppDelegate内の初期化部分です。…あ〜これだ:
AppDelegate.cpp // turn on display FPS
director->setDisplayStats(true);
もうまんまコメントに書いてありますね(^-^;。ここをfalseにするとFPSの描画が消えます。これでアプリを動かすと〜:
はい消えた〜。これで空っぽ環境ができました。
ただですねぇ。プロジェクト内にBox2D、cocos2D、Spineの各ライブラリを作成するプロセスが入るのが非常に気に入りません。だって、間違ってビルド回すと凄まじい待ち時間を強いられるんですもの。それをしないために.libがあるわけです。なので、自分のゲームのプロジェクトに各.libをリンクさせて、ライブラリを作るプロセスはソルーションから除いてしまいましょう。
C ライブラリ作成プロジェクトをソルーションから除く
まず自分のプロジェクトが参照しているlibBox2D.lib、libcocos2D.libそしてlibSpine.libを自分のプロジェクトに取り込んでしまいます。各.libはビルドしたフォルダの中([プロジェクトルート]/proj.win32/Debug.win32及びRelease.wim32フォルダ)にあります。無い場合はDebug版、Release版で一度ビルドを回して下さい。
自分のプロジェクトのプロパティを開き、[リンク]→[入力]→[追加の依存ファイル]に各.libをリンクしましょう:
ライブラリへのパスはもう通っているのでこのままでリンクできます。
次に、自分のプロジェクトは他のプロジェクトを参照している状態になっています。これを外してしまいましょう。同じくプロジェクトのプロパティから[共通プロパティ]→[参照]を開くと各プロジェクトへ参照が通っているのがわかると思います。下にある[参照の削除]ボタンを押下げて全部外してしまいます。
最後にVisual StudioのソルーションエクスプローラでlibBox2D、libcocos2D、libSpineプロジェクトで右クリックをして[プロジェクトのアンロード]を選択します。これでプロジェクトはソルーションから一時的に利用不可となり、ビルド対象からも外れます。また使いたくなったら同じように右クリックして[プロジェクトの再読み込み]をすればいつでも復帰できます。こうしておくと万が一「lib無くした〜(涙)」という時に便利です。
これでプロジェクト内でアクティブなのは自分のプロジェクトだけになりました。F5で実行しても他のプロジェクトのビルドはもう回りませんので、ビルド作業がサクサクになります(^-^)。あ〜すっきり!
気分爽快になった所で、何かオリジナルに表示してみましょう。