Cocos2d-x 3.17.2 のサンプルアプリを起動する（iOS / Android）

# はじめに
cocos2d-x 3.17.2 を C++API の利用を前提にセットアップして画像のようなサンプルアプリを Android Emulator & iOS Simulator 上で起動させることをこの記事のゴールとします。
v2.2.6（iOSのみ）は[Cocos2d-x 2.2.6 のサンプルアプリを起動する（iOS）](https://qiita.com/tikidunpon/items/40b5c71eb829e2d76099)をご確認ください。

![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-08-06 at 00.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9628/b30cdcb7-e96e-c57a-e38f-eb52c909847b.png)

# 環境
- cocos2d-x 3.17.2
- Xcode 11.6
- Android Studio 3.6.3
- Gradle 4.6
- NDK 16.1.4479499
- CMake 3.6.4111459

# 導入手順

## Cocos2d-x本体と依存関係のダウンロード
基本的には公式のREADMEのとおりです。
https://github.com/cocos2d/cocos2d-x/tree/cocos2d-x-3.17.2

### 1. リポジトリをcloneする
```sh
$ git clone git@github.com:cocos2d/cocos2d-x.git
```
### 2. cocos2d-x-3.17.2にswichする

```sh
$ cd cocos2d-x
$ git switch -c v3.17.2 cocos2d-x-3.17.2
```
### 3. 依存関係をダウンロードする
依存関係を[cocos2d-x-3rd-party-libs-bin](https://github.com/cocos2d/cocos2d-x-3rd-party-libs-bin)からダウンロードします。

```sh
$ python download-deps.py
```

### 4. サブモジュールの初期化
cocosコマンドなどのサブモジュールを初期化します。

```sh
$ git submodule update --init
```

## cocosコマンドのセットアップ
### 1. 環境変数の設定
cocosコマンド実行やプロジェクトのテンプレート作成に必要な環境変数を設定します。

```sh
$ cd cocos2d-x
$ ./setup.py
``` 
setup.pyの実行後に以下のメッセージが表示されるので source を実行して環境変数を読み込みます。

```
Please execute command: "source 環境によって異なるファイルパス" to make added system variables take effect
```

```sh
$ source 環境によって異なるファイルパス
```

### 2. cocosコマンドでバージョンを確認
cocosコマンドで cocos2d-x のバージョンが 3.17.2 であることをを確認します。

```sh 
$ cocos -v
cocos2d-x-3.17.2
Cocos Console 2.3
```

## 動作確認用のプロジェクトを作成する

以下コマンドを参考にプロジェクトを作成します。

```sh
$ cocos new MyGame -p com.your_company.mygame -l cpp -d MyGameDir
```

## iOSプロジェクトをビルドする

### 1. iOSプロジェクトを開く
proj.ios_mac にXcodeプロジェクトが作成されるので移動して開きます。

```sh 
$ cd MyGameDir/MyGame/proj.ios_mac
$ open open MyGame.xcodeproj
```

### 2. ビルドターゲットの変更
mobile用のターゲットを選択します。
<img width="397" alt="スクリーンショット 2020-08-06 0.28.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9628/398a3475-a2ac-dae5-74cc-be9595c8a3a1.png">

### 3. 一度ビルドしてエラーを修正する
ビルドすると `Argument value 10880 is outside the valid range [0, 255]` のエラーになるので、以下の記事を参考に修正します。
[Cocos2d-x 3.17.2をiOS, Androidでコンパイルできないんですけど](https://qiita.com/nekomimimi/items/fe47be63e53316b9e93c)

### 4. Info.plistでBundle version stringを設定
Bundle version stringが空になっているので設定します。

```info.plist
<key>CFBundleShortVersionString</key>
<string>0.0.1</string>
```

### 5. 実行して動作確認する
プロジェクトをRunして雛形のアプリの起動を確認します。

![Simulator Screen Shot - iPhone SE (2nd generation) - 2020-08-06 at 00.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9628/b30cdcb7-e96e-c57a-e38f-eb52c909847b.png)


## Androidプロジェクトのビルド

### 1. Androidプロジェクトを開く
proj.android に作成されるAndroidプロジェクトを開きます。

```sh 
$ cd MyGameDir/MyGame/proj.android
```

### 2. NDKとCMakeのインストール
以下公式ドキュメントを参考に NDK 16.x と CMake 3.6.x をインストールします。
https://developer.android.com/studio/projects/install-ndk

### 3. エミュレータで実行する
実行してサンプルアプリの起動を確認します。

## トラブルシューティング  

### NDK not configured が出る場合

NDKをダウンロードしたにも関わらず、エラーが表示される場合はNDKパスの設定が必要です。

```
A problem occurred configuring project ':MyGame'.
> NDK not configured. 
  Download it with SDK manager.
```

プロジェクトローカルな設定で修正する例は次のとおりです。

```local.properties
ndk.dir=/User/username/Library/Android/sdk/ndk/16.1.4479499
```

### CMAKE_MAKE_PROGRAM is not set が出る場合
CMakeをダウンロードしたにも関わらず、エラーが表示される場合 Android Gradle プラグインのバージョンとCMakeのバージョンの組み合わせが悪い可能性があります。

```
CMake Error: CMake was unable to find a build program corresponding to "Ninja". 
CMAKE_MAKE_PROGRAM is not set.  You probably need to select a different build tool.
```

CMakeのバージョンを3.6に下げるか、Android Gradle プラグインのバージョンを上げることで対応ができます。

**Android Gradle プラグインのバージョンを上げる**

CMake 3.10を使う場合は、プロジェクトルートのbuld.gradleを開き、Android Gradle プラグインのバージョンを 3.1.0 から 3.2.1 に変更して Sync Project with Gradle Files を再実行してください。


```build.gradle(proj.android)

classpath 'com.android.tools.build:gradle:3.2.1'
```