最近ぐいぐいきているCocos2d-xについて調べました。
Cocos2d-xは、マルチプラットフォームの2Dゲームフレームワークです。マルチプラットフォームのゲームフレームワークというとUnityも有名ですが、最近の感覚値では、2Dゲームの場合はCocos2d-xの方が支持されているように思います。
読んだ本
「cocos2dの初期化処理を追ってみる。」も書きましたが、cocos2d for iPhoneは以前に使っていたので、cocos2d自体の仕様はだいたい理解しています。今回は、マルチプラットフォームのCocos2d-xの大枠を知るのが目的です。
この本をざーっと読みました。
cocos2d-xによるiPhone/Androidアプリプログラミングガイド
C++を書けばiPhoneとAndroidに同時に対応できる。
Cocos2d-xの最大の魅力は、ひとつのソースコードから、iPhoneアプリとAndroidアプリを同時に作成できることです。
Cocos2d-xは、マルチプラットフォームで動作する言語としてC++を用いています。iPhoneアプリはObjective-Cで書かれ、AndroidアプリはJavaで書かれるので、一見共通の言語で書き上げることは不可能に思われます。しかし、C++で、iPhoneアプリ、Androidアプリを同時に書くことができます。
iOSについては、Objective-CがC言語の上位互換であるので、C言語はもちろん実行できるのですが、Objective-C++としてObjective-Cに混在させてC++を使うこともできます。
Androidについては、JNIによってC/C++で書かれたネイティブコードを実行することができます。C++で書かれたゲームをネイティブコードとして読み込ませれば、JavaベースのAndroidアプリからも実行することができるようになります。
Cocos2d-xをインストールする。
簡単に書いていきます。バージョンなどは環境依存にあわせて適宜書き換えるなどしてください。2ヶ月前の作業ログを元に書いているので間違えている場所があるかもしれません・・・。
curl -o cocos2d-x-2.1.5.zip http://cocos2d-x.googlecode.com/files/cocos2d-x-2.1.5.zip
unzip cocos2d-x-2.1.5.zip
mv ./cocos2d-x-2.1.5 ~/cocos2d-x-2
AndroidでC++のネイティブコードを実行するために、Android NDKをインストールします。EclipseのパスやAndroid SDKのパスはご自身の環境に合わせてください。
curl -o android-ndk-r9-darwin-x86_64.tar.bz2 http://dl.google.com/android/ndk/android-ndk-r9-darwin-x86_64.tar.bz2
bzip2 -dc android-ndk-r9-darwin-x86_64.tar.bz2 | tar xvf -
mv ./android-ndk-r9 /Applications/eclipse/android-ndk
sed -i -e 's/^NDK_ROOT_LOCAL=.*$/NDK_ROOT_LOCAL="/Applications/eclipse/android-ndk"/' ~/cocos2d-x-2/create-android-project.sh
sed -i -e 's/^ANDROID_SDK_ROOT_LOCAL=.*$/ANDROID_SDK_ROOT_LOCAL="/Applications/eclipse/android"/' ~/cocos2d-x-2/create-android-project.sh
sed -i -e '2s/^/NDK_ROOT="/Applications/eclipse/android-ndk"/' ~/cocos2d-x-2/template/multi-platform-cpp/proj.android/build_native.sh
テンプレートからプロジェクトを作成する。
テンプレートからプロジェクトを作成することができます。
cd ~/cocos2d-x-2/tools/project-creator/
./create_project.py -project Cocos2dxExample -package in.katty.cocos2dxexample -language cpp
作成されたプロジェクトファイル群には、プラットフォームに対して共通のゲーム本体を各Classesディレクトリと、画像などのリソースを格納するResourcesディレクトリと、それを参照するAndroid、iPhone、その他のプロジェクトディレクトリがあります。
- Classes: C++で書かれたソースコード
- Resources: 画像などの素材
- proj.xxx: 各プラットフォーム向けのプロジェクトディレクトリ
iPhoneアプリとして実行
iPhone向けのプロジェクトは、proj.iosの中にあります。
これを実行するのに必要なのは、Cocos2d-xとXcodeだけです。
- Cocos2d-x
- Xcode
プロジェクトを開いて、Xcodeでビルドして実行してみると、Cocos2d-xのHello Worldアプリが実行できます。
ここで何が起きているかというと、XcodeはC++をビルドできるので、そのまま実行しているだけです。
Androidアプリとして実行
proj.androidには、Android向けのプロジェクトがあります。
Androidの場合は少し環境設定が大変ですが、Android SDKとAndroid NDKのインストールが必要です。
- Cocos2d-x
- Android SDK
- Android NDK
- Eclipse
libcocos2dxというライブラリをEclipseにライブラリプロジェクトとして導入したあと、作成されたCocos2d-xプロジェクトをEclipseで開いてビルドして実行すると、Androidでも実行ができます。
ここで何が起きているかというと、C++で書かれたソースコードをAndroid NDK用にライブラリ化していて、ResourcesのファイルをAndroidプロジェクトのAssetにしています。それを、libcocos2dxから呼び出してゲームを実行しています。
シンプルな構成で良い!
どちらの環境で起動しても、参照しているソースコードはClassesディレクトリです。したがって、Xcodeで開発をしたものを、あとでAndroid向けにそのままビルドできるような構造になっています。
iPhone向けにビルドする場合にしてもAndroid向けにビルドする場合にしても基本的な技術の組み合わせによってできているのでシンプルで理解しやすいです。これからますます流行っていく気がします!