【cocos2d-x 3.0】binding-generatorでScript Bindingを自動化する方法


[cocos2d-x Advent Calendar 2013](http://qiita.com/advent-calendar/2013/cocos2d-x) 12月15日の記事です。

まずは投稿が遅れましたことお詫び申し上げます。

## この記事は？

まだalpha版であるcocos2d-x 3.0では、さまざまな新機能が追加されています。

そのなかでも、従来は面倒だったScript Bindingが簡単に行えるユーティリティ`binding-generator`をご紹介します。

今回は特にLua Bindingを例に説明します。

## cocos2d-x 3.0 alpha

今年9月にcocos2d-x 3.0のalpha版が公開されました。

12/7に開催された『[札幌C++勉強会 #5](http://giginet.hateblo.jp/entry/2013/12/09/024739)』において、cocos2d-x 3.0の新機能についてセッションを行いました。

Script Binding以外の変更点については以下のスライドをご覧ください。

<iframe src="http://www.slideshare.net/slideshow/embed_code/29003161" width="427" height="356" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC;border-width:1px 1px 0;margin-bottom:5px" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="https://www.slideshare.net/giginet/cocos2dx-30-c11" title="cocos2d-x 3.0 + C++11で始めるゲーム開発超入門" target="_blank">cocos2d-x 3.0 + C++11で始めるゲーム開発超入門</a> </strong></div>

## cocos2d-x 2.xまでのLua Binding

Script Bindingには、二つの言語を橋渡しするためのコード（Glue Code）が必要です。

従来は`*.pkg`という特殊な定義ファイルを記述し、`tolua++`というユーティリティを使うことで自動生成してくれてました。これはこれで便利。

![Screen Shot 2013-12-16 at 05.04.19 .jpg](https://qiita-image-store.s3.amazonaws.com/0/10009/03e1ca23-a0b5-07fd-4eaa-247d0086af35.jpeg)
↑こういうコードが自動生成される。

詳しくは以下の記事が詳しかったので参照のこと

[tolua++の使い方（主にMac） - プログラミングの魔物](http://p-monster.hatenablog.com/entry/2012/12/12/170111)

ただし、全てのクラスやメソッドを*pkgに記述する手間が発生し、数が多くなると大変になったり、それに起因するバグもありました。

[cocos2d-xのバグを直したらmergeされた話 - 5.1さらうどん](http://giginet.hateblo.jp/entry/2013/03/04/194604)

## cocos2d-x 3.0からのLua Binding

cocos2d-x 3.0からは`binding-generator`というユーティリティを使うことで、headerから自動的にクラスやメソッドを探索し、Glue Codeを自動生成できるようになりました。

また、設定もかなり柔軟に記述することができ、従来手動で行っていた定義ファイルの作成を簡略化できます。

[cocos2d/bindings-generator](https://github.com/cocos2d/bindings-generator)


## Macでのセットアップ

ちょっとセットアップが面倒なので解説します

下記ページ参照。[今のところWindowsには対応してない](https://github.com/cocos2d/cocos2d-x/blob/develop/tools/tolua/README.mdown)ようです。

[bindings-generator/README.md at master · cocos2d/bindings-generator](https://github.com/cocos2d/bindings-generator/blob/master/README.md)

### cocos2d-x 3.0のインストール

こちらからcocos2d-x 3.0 alpha1(12/15現在)をダウンロードして、解凍。`$HOME/cocos2d-x-3.0`に置きます。

http://www.cocos2d-x.org/download

### Pythonパッケージのインストール

必要なPythonパッケージをインストールしてください。標準のPythonを使ってるなら`easy_install`で。


```sh
sudo easy_install pyyaml, cheetah
```

or

```sh
pip install pyyaml, cheetah
```

### llvm-clang-3.3の導入

下記ページから`Clang Binaries for Mac OS X `ダウンロードしてください。Homebrewでも入るみたいですが未検証。
ドキュメントでは3.1になってましたが、3.3を使わないと上手くいかなかったので、そちらをダウンロードしてください

今回は`$HOME/llvm+clang-3.3`に設置。

http://llvm.org/releases/download.html#3.3

### Android NDKの導入

下記ページから。

http://developer.android.com/tools/sdk/ndk/index.html

今回は`/Applications/Android/android-ndk`に設置。

Homebrewでも入るようだ。

```sh
brew install android-ndk
```

### 環境変数の設定

各種環境設定を設定します。今までインストールしたパスを指定してください。

筆者はPythonはpyenvでインストールしているため、以下のようなPATHになりますが、通常は`/usr/bin/python`とかでOKかと。

```sh
export PYTHON_BIN=$HOME/.pyenv/shims/python
export COCOS2DX_ROOT=$HOME/cocos2d-x-3.0
export NDK_ROOT=/Applications/Android/android-ndk
export CLANG_ROOT=$HOME/clang+llvm-3.3
```

### cocos2d-xのGlue Codeを生成する

試しにcocos2d-xのLua Binding用のコードを生成してみましょう。

```sh
cd $COCOS2DX_ROOT/tools/tolua
./genbindings.sh
```

上手くいくと`$COCOS2DX_ROOT/scripting/auto-generated/lua-bindings`に93000行、2.6MBもの巨大なソースコードが自動生成されてるはず。やったね！

![Screen Shot 2013-12-16 at 03.23.51 .jpg](https://qiita-image-store.s3.amazonaws.com/0/10009/b832cb23-f047-a05a-76a6-e29f0f4cfcfd.jpeg "Screen Shot 2013-12-16 at 03.23.51 .jpg")

また、同時に`userconf.ini`という設定ファイルが生成されます。これは環境変数を設定するファイルで、付属している`genbindings.sh`が自動的に生成してくれます。


## 自分のプロジェクトで生成してみる

ここまでのセットアップが面倒ですでにかなり疲れたんですが、今度は本題の自分のプロジェクトから生成してみます。

### your_game.iniを記述する

生成するGlue Codeの設定を`your_game.ini`に記述しておくことで、下記のように生成したり無視したりするクラス・メソッドをかなり柔軟に指定できます。

基本的に`cocos2dx.ini`をコピーしてきて、必要に応じて書き換えてください。

```
# parseするheaderのPATHを指定する
headers = %(cocosdir)s/cocos2dx/include/cocos2d.h %(cocosdir)s/CocosDenshion/include/SimpleAudioEngine.h ../Classes/LuaBindSample.h

# 生成するクラスの一覧を記述する（正規表現可）
classes = ^GameObject$

# 無視するクラスとメソッドの組を記述する（正規表現可）
skip = IgnoredClass::[ignoredMethod{0-9} anotherMethod],

```

[LuaBindSample/binding-generator/bind_sample.ini at master · giginet/LuaBindSample](https://github.com/giginet/LuaBindSample/blob/master/binding-generator/bind_sample.ini)

記述方法はコメントに書いているので、詳解は割愛します。

詳しくは[cocos2dx.ini](https://github.com/cocos2d/cocos2d-x/blob/develop/tools/tolua/cocos2dx.ini)を参考にしてください

Python製のCHEETAHというテンプレートエンジンで動いているようなので、文法などは下記が参考になるかも。

[Cheetah - The Python-Powered Template Engine](http://www.cheetahtemplate.org/)


### userconf.iniを記述する

先ほど、環境変数で指定したPATHを`userconf.ini`というファイルに記述しておくことで、勝手に読み込んで実行してくれるようです。

環境変数などは使えないので、それぞれの環境に合わせて作ると良いと思います。

例えば下記のような感じ。

```
[DEFAULT]
androidndkdir=/Applications/Android/android-ndk-r8e
clangllvmdir=/Users/giginet/clang+llvm-3.3
cocosdir=/Users/giginet/cocos2d-x-3.0
cxxgeneratordir=/Users/giginet/cocos2d-x-3.0/tools/bindings-generator
extra_flags=
```

### スクリプトを実行する

あとは`binding-generator`のgenerator.pyに適切な引数を渡すだけで実行できます。

引数が多いのでこういうラッパーを書いておくと便利

```sh
#!/bin/bash
GENERATOR_ROOT=${COCOS2DX_ROOT}/tools/bindings-generator
INI_FILE=bind_sample.ini
SECTION_NAME=your_game
OUTPUT_PATH=../Classes/LuaGlue
OUTPUT_NAME=lua_your_game_auto
LD_LIBRARY_PATH=${CLANG_ROOT}/lib $PYTHON_BIN ${GENERATOR_ROOT}/generator.py $INI_FILE -s $SECTION_NAME -t lua -o ${OUTPUT_PATH} -n $OUTPUT_NAME
```

これを実行することで、`lua_your_game_auto.h/cpp`が`../Class/LuaGlue`以下に生成されます。凄い！

### サンプルプロジェクト

Githubに検証用のリポジトリを作ったので置いておきます。

[LuaBindSample/binding-generator at master · giginet/LuaBindSample](https://github.com/giginet/LuaBindSample/tree/master/binding-generator)

`$COCOS2DX_ROOT/projects`以下にcloneすると動きます。

## JavaScript Bindingは？

試してないけど、同様に行ける気がします。誰か書いてください。

## まとめ

環境構築はメチャクチャ大変でしたが、簡単にGlue Codeが生成できて素晴らしい感じですね。正規表現などで柔軟に記述できるのも良い。

次にゲーム作るときには有効活用しようと思います。

## Lua関係の関連記事

以前に書いたLua関係の便利情報です。

[JenkinsでLuaのSyntaxチェックを自動化してみた - 5.1さらうどん](http://giginet.hateblo.jp/entry/2013/05/03/175830)

[cocos2d-xのLuaバインディングについて解説してみる - 5.1さらうどん](http://giginet.hateblo.jp/entry/2012/10/10/070651)

## 宣伝 

cocos2d-x製の拙作、音を奏でる奥スクロールRPG『VOXCHRONICLE』というゲームを公開しています。

完全無料で遊べるので、この記事が役に立ちましたら是非遊んでみてください。このゲームでは大部分にLua Bindingが利用されています。

![](http://cdn-ak.f.st-hatena.com/images/fotolife/g/gigi-net/20130512/20130512161149.png)

[VOXCHRONICLE - オクスクロニクル - on the App Store on iTunes](https://itunes.apple.com/us/app/voxchronicle/id631105533?ls=1&mt=8)

[音を奏でる奥スクロールRPG『VOXCHRONICLE -オクスクロニクル-』リリースしました - 5.1さらうどん](http://giginet.hateblo.jp/entry/2013/05/12/164133)

[iPhoneゲームでインタラクティブミュージックに挑戦してみた話 - 5.1さらうどん](http://giginet.hateblo.jp/entry/2013/05/20/175416)

[giginet/VOXCHRONICLE](https://github.com/giginet/VOXCHRONICLE)