31
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

cocos2d-xAdvent Calendar 2013

Day 15

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

Last updated at Posted at 2013-12-15

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++というユーティリティを使うことで自動生成してくれてました。これはこれで便利。

Screen Shot 2013-12-16 at 05.04.19 .jpg
↑こういうコードが自動生成される。

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

tolua++の使い方(主にMac) - プログラミングの魔物

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

cocos2d-xのバグを直したらmergeされた話 - 5.1さらうどん

cocos2d-x 3.0からのLua Binding

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

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

cocos2d/bindings-generator

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もの巨大なソースコードが自動生成されてるはず。やったね!

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

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

詳しくは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さらうどん

iPhoneゲームでインタラクティブミュージックに挑戦してみた話 - 5.1さらうどん

giginet/VOXCHRONICLE

31
31
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
31

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?