cocos2d-x Advent Calendar 2013 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』において、cocos2d-x 3.0の新機能についてセッションを行いました。
Script Binding以外の変更点については以下のスライドをご覧ください。
cocos2d-x 2.xまでのLua Binding
Script Bindingには、二つの言語を橋渡しするためのコード(Glue Code)が必要です。
従来は*.pkg
という特殊な定義ファイルを記述し、tolua++
というユーティリティを使うことで自動生成してくれてました。これはこれで便利。
詳しくは以下の記事が詳しかったので参照のこと
tolua++の使い方(主にMac) - プログラミングの魔物
ただし、全てのクラスやメソッドを*pkgに記述する手間が発生し、数が多くなると大変になったり、それに起因するバグもありました。
cocos2d-xのバグを直したらmergeされた話 - 5.1さらうどん
cocos2d-x 3.0からのLua Binding
cocos2d-x 3.0からはbinding-generator
というユーティリティを使うことで、headerから自動的にクラスやメソッドを探索し、Glue Codeを自動生成できるようになりました。
また、設定もかなり柔軟に記述することができ、従来手動で行っていた定義ファイルの作成を簡略化できます。
Macでのセットアップ
ちょっとセットアップが面倒なので解説します
下記ページ参照。今のところWindowsには対応してないようです。
bindings-generator/README.md at master · cocos2d/bindings-generator
cocos2d-x 3.0のインストール
こちらからcocos2d-x 3.0 alpha1(12/15現在)をダウンロードして、解凍。$HOME/cocos2d-x-3.0
に置きます。
Pythonパッケージのインストール
必要なPythonパッケージをインストールしてください。標準のPythonを使ってるならeasy_install
で。
sudo easy_install pyyaml, cheetah
or
pip install pyyaml, cheetah
llvm-clang-3.3の導入
下記ページからClang Binaries for Mac OS X
ダウンロードしてください。Homebrewでも入るみたいですが未検証。
ドキュメントでは3.1になってましたが、3.3を使わないと上手くいかなかったので、そちらをダウンロードしてください
今回は$HOME/llvm+clang-3.3
に設置。
Android NDKの導入
下記ページから。
今回は/Applications/Android/android-ndk
に設置。
Homebrewでも入るようだ。
brew install android-ndk
環境変数の設定
各種環境設定を設定します。今までインストールしたパスを指定してください。
筆者はPythonはpyenvでインストールしているため、以下のようなPATHになりますが、通常は/usr/bin/python
とかでOKかと。
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用のコードを生成してみましょう。
cd $COCOS2DX_ROOT/tools/tolua
./genbindings.sh
上手くいくと$COCOS2DX_ROOT/scripting/auto-generated/lua-bindings
に93000行、2.6MBもの巨大なソースコードが自動生成されてるはず。やったね!
また、同時に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
記述方法はコメントに書いているので、詳解は割愛します。
詳しくはcocos2dx.iniを参考にしてください
Python製のCHEETAHというテンプレートエンジンで動いているようなので、文法などは下記が参考になるかも。
Cheetah - The Python-Powered Template Engine
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に適切な引数を渡すだけで実行できます。
引数が多いのでこういうラッパーを書いておくと便利
#!/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
$COCOS2DX_ROOT/projects
以下にcloneすると動きます。
JavaScript Bindingは?
試してないけど、同様に行ける気がします。誰か書いてください。
まとめ
環境構築はメチャクチャ大変でしたが、簡単にGlue Codeが生成できて素晴らしい感じですね。正規表現などで柔軟に記述できるのも良い。
次にゲーム作るときには有効活用しようと思います。
Lua関係の関連記事
以前に書いたLua関係の便利情報です。
JenkinsでLuaのSyntaxチェックを自動化してみた - 5.1さらうどん
cocos2d-xのLuaバインディングについて解説してみる - 5.1さらうどん
宣伝
cocos2d-x製の拙作、音を奏でる奥スクロールRPG『VOXCHRONICLE』というゲームを公開しています。
完全無料で遊べるので、この記事が役に立ちましたら是非遊んでみてください。このゲームでは大部分にLua Bindingが利用されています。
VOXCHRONICLE - オクスクロニクル - on the App Store on iTunes
音を奏でる奥スクロールRPG『VOXCHRONICLE -オクスクロニクル-』リリースしました - 5.1さらうどん