趣味でゲームアプリ開発をやろうしてcocos2d-xに手を出す。不安定覚悟で最新っぽい環境を構築してみたのでメモ。
(9/29追記:cocos2d-jsとして使う場合もほぼおなじで大丈夫なのが確認できたので追記しました)
主なポイント
- ADT(Eclipse)ではなくAndroidStudio
- エミュレータにはGenymotion
- Androidビルド時に
INSTALL_FAILED_NO_MATCHING_ABIS
が出る対策 - Xcode7 (特に何もせずそのままいけた)
- できるだけhomebrew
- Antのインストールはもはや不要。gradle!
- cocos2d-htmlはcocos2d-jsとして同じパッケージに統合され、C++での開発もJavaScriptでの開発もこのセットアップでOK
- 実機での動作は未確認
TL; DR
Cocos2dx開発環境構築 〜 シミュレータでアプリ起動 手順まとめ。
Setup
brew update
brew install android-sdk
brew install android-ndk
brew cask install java
brew cask install android-studio
Android SDK Managerで
- Tools/Android SDK Build-tools 22.0.1
- Android 5.1.1(API 22)/SDK Platform 22
をインストール
brew cask install virtualbox
brew cask install genymotion
Nexus6のイメージを取得、起動しておく
公式からダウンロードして解答したcocos2d-x-3.8.1
mv ~/Downloads/cocos2d-x-3.8.1 /usr/local/opt/cocos2d-x
cd /usr/local/opt/cocos2d-x
./setup.py
----------
Please enter the path of ANT_ROOT (or press Enter to skip): ==>[Enter]
----------
mv cocos2d-x cocos2d-x-3.8.1
ln -s cocos2d-x-3.8.1 cocos2d-x
Create Project (C++で書く人)
cocos new MyGame -l cpp
Create Project (JavaScriptで書く人)
cocos new MyGame -l js
JavaScript開発(-l js
)の場合、一箇所修正が必要な模様
public class AppActivity extends Cocos2dxActivity {
@Override
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
// TestCpp should create stencil buffer
//
// 修正
// glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
glSurfaceView.setEGLConfigChooser(8, 8, 8, 0, 16, 8);
return glSurfaceView;
}
}
Run for Android
cd MyGame
cocos run -p android --android-studio --app-abi x86
Run for iOS
cd MyGame
cocos run -p ios
Run for iOS (-l js
で作ったプロジェクトのみ可)
cd MyGame
cocos run -p ios
Android Studio対応状況
[FINAL!] All in one Cocos2d-x&JS v3.7 is released - cocos2d-x - Cocos2d-x Forum
Get your hands on Android Studio 1.3 | Android Developers Blog
Cocos2dx側でAndroid Studio用のプロジェクトファイルは生成してくれるようになっているし、
Android StudioもC++周りの機能が。(Previewバージョンだけど)
とはいえCocos界隈でAndroid Studioへの移行が進んでいるのかは謎。
でも人柱覚悟でAndroidStudioでいってみる。
Prerequisite
確認した環境は
- Mac OSX Yosemite
- Cocos2d-x 3.8.1
- Xcode7
- Android Studio 1.3
- JDK 1.8
- Android SDK 24.3.4
- Android NDK r10e
あらかじめ入ってる前提にしたもの
- Homebrew
- Homebew Cask
- Xcode
cocos2d-x の配置場所
再掲
公式からダウンロードして解答したcocos2d-x-3.8.1
mv ~/Downloads/cocos2d-x-3.8.1 /usr/local/opt/cocos2d-x
cd /usr/local/opt/cocos2d-x
./setup.py
----------
Please enter the path of ANT_ROOT (or press Enter to skip): ==>[Enter]
----------
mv cocos2d-x cocos2d-x-3.8.1
ln -s cocos2d-x-3.8.1 cocos2d-x
よくホーム直下にcocosを配置、って書いてあるけど、もうちょっとそれっぽいところに配置してみたつもり。
まず /usr/local/opt/cocos2d-x
に配置した状態で setup.py
を実行して、
export COCOS_CONSOLE_ROOT=/usr/local/opt/cocos2d-x/tools/cocos2d-console/bin
...
になるように .bashrc/.zshrc に設定を書き出させ、
その後、実ファイルを cocos2d-x-3.8.1
に移動して、cocos2d-x
にシンボリックリンクを張っておく。
これで、もしcocosのバージョンが上がったら /usr/local/opt/cocos2d-x-X.X.X
に配置して、シンボリックリンクの向き先を変えば幸せになれる計画。
cocos2d-xがhomebrew fomulaになったらこうなりそう・・というイメージで配置してみた。
誰かfomula作ってくれないかな・・・。
Troubleshooting
ANT_ROOT not defined. Please define it in your environment.
AndroidStudioではなく ADT用のプロジェクトでビルドしようとしている
--android-studio
オプションを指定してAndroidStudio用プロジェクトをビルド
Can't connect to activity manager; is the system running?
Error type 2
android.util.AndroidException: Can't connect to activity manager; is the system running?
at com.android.commands.am.Am.onRun(Am.java:299)
at com.android.internal.os.BaseCommand.run(BaseCommand.java:47)
at com.android.commands.am.Am.main(Am.java:97)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:249)
デバイスを起動させるのを忘れて cocos run
してしまい、後からデバイスを起動するとこうなる模様
デバイスを起動させた状態でもうちど cocos run -p android --android-studio --app-abi x86
でOKなはず
Failure [INSTALL_FAILED_NO_MATCHING_ABIS]
ネイティブコードのビルドターゲットがおかしい。
デフォルトでビルドするとターゲットアーキテクチャはARMになるらしい。でもGenymotionエミュレータのアーキテクチャはx86なので動かないよ状態。
--app-abi x86
オプションの指定を忘れるとこうなる。
java.lang.IllegalArgumentException: No config chosen
JavaScriptでの開発時、生成されたプロジェクトそのままで起動しようとすると、アプリ起動直後、下記のエラーでクラッシュする
(cocosコンソールからでもAndroidStudioからでも)
09-29 09:19:24.288 2428-2448/org.cocos2dx.MyGame E/AndroidRuntime﹕ FATAL EXCEPTION: GLThread 199
Process: org.cocos2dx.MyGame, PID: 2428
java.lang.IllegalArgumentException: No config chosen
at android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:869)
at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1023)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1400)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)
対応方法(再掲)
public class AppActivity extends Cocos2dxActivity {
@Override
public Cocos2dxGLSurfaceView onCreateView() {
Cocos2dxGLSurfaceView glSurfaceView = new Cocos2dxGLSurfaceView(this);
// TestCpp should create stencil buffer
//
// 修正
// glSurfaceView.setEGLConfigChooser(5, 6, 5, 0, 16, 8);
glSurfaceView.setEGLConfigChooser(8, 8, 8, 0, 16, 8);
return glSurfaceView;
}
}
デバッガで追うとR:5bit, G:6bit, B:5bit なEGLConfigが存在しないのでエラー・・・という感じになっているようなんですが、AndroidのOpenGL周りはまだよくわからず。
なんでCocos2d-JSが5, 6, 5 で生成するのか・・・