スライドには手をふれませんでした

さっそく、本を借りてネットと共に駆使してLuaの勉強をしてみました。

テーブル、ハッシュテーブル、メタテーブル、クラス(っぽい書き方?)の辺りは読んだだけで終わらせたのですが、とりあえずコマンドラインから貰った数値の階乗を表示するプログラムをfor, while, repeat文で書いてたりしました。コマンドラインの型を調べたらstringだったのでtonumber()で数値に変換することに気付くまで1時間ちょっと…。

という感じでLuaの基本文法はやりながら覚えたほうが良いと感じたのと、シェルスクリプトなんかと書き方が若干似ている箇所があったのでわりと書きやすかったので、そのままVMを自作プログラムに組み込むというのをやってみました。

とりあえずLuaがスタック方式を使ってVM側とC++側がやりとりし、C++側の関数をバインドする場合は必ずLuaが呼び出せる形式(具体的には int (*lua_func_type)( lua_State* ) 型)にする必要があり、C++の関数をそれと合うように仲介役の関数(グルーコード)を書く必要がある。さらにグルーコードをVMに登録する必要がある(VMは実行中に生成するはずなので登録は実行時動作?)

…みたいな流れが必要なんだそうで。

どうもグルーコード書くのがめんどくさい&スタック意識して全てのグルーコードを書く必要がある、といったところが不便だったので、やはり「スクリプト言語による効率的ゲーム開発」という今回借りた本にもグルーコードを自動生成するためのライブラリを紹介していました。

tolua++というライブラリだったのですが、バッチファイルを動かしてグルーコードを生成する、また自動化する際はコンパイラオプションにつけたりする必要がある、とか面倒だったので何か無いかと思ったらboostとテンプレートを使ったLuabindなるライブラリがあるではありませんか。

http://www.rasterbar.com/products/luabind.html Luabind 公式
http://d.hatena.ne.jp/matobow/20060604/p1 Luabindを試す - ブロードバンド対応日記

2つ目のブログ記事を基にしますが、実際にLuabindが動いているのはmain関数のluabind::open( lua );から12行ぐらいです。

見た感じ、luabind::open()関数はVMをLuabindで使える状態にするような関数でしょうか。

luabind::module()で引数に指定したVMにグルーコードを自動生成して渡す。luabind::def()は関数を登録、luabind::class_はクラスを登録する為のもので、中の.defはクラスのメンバメソッドを登録しているのでしょう。コンストラクタがluabind::constructerテンプレートによって生成されているのにはちょっと注目しておきたい所ではあります。

後は、これまでのLuaコードと同じように書くだけで問題ないです。

中々良さそうです。問題はその情報の少なさでしょうか。ごく単純な使い方は載ってそうですが、深く突っ込んだ内容は微妙な気がします。

やはりグルーコードを自分で書くのは面倒なので、こういったライブラリを積極的に使っていきたいですね。