[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
作成するゲームのスクリプトとしてLuaを使用することにしたので覚え書きを。
後、LuaBindを使ってみます。
Luaについては下の本がおすすめです。(以下アマゾンリンク)
入門Luaプログラミング
スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践
LuaBindについては、おすすめのページ、書籍などありましたらコメントをお願いします。
(Web上にもあんまり情報がありませんね……英語でいいからリファレンスサイトが欲しい……)
・Lua、LuaBindの取得、展開
Luaの公式サイトはここですが、Shift_JISだと問題があるみたいなのでここからダウンロード。
LuaBindはここから。
展開先はD:\Project 以下にしました。参考にする方は適宜読み替えてください。
・Luaのビルド、VisualStudioの設定
Luaはとりあえずスタティックリンクでいきます。
デバッグ版のライブラリが無かったので、ビルドしました。
lua5.1\mak.vs2005\lua5.1.slnをダブルクリック、
lua5.1_libの設定でデバッグ版の出力先を../lib/staticに、
出力ファイルを$(OutDir)/lua5.1_D.libに変更しました。
(出力位置とファイル名は自分がやりやすいようにです。)
VSのオプション→プロジェクトおよびソリューション→VC++ ディレクトリで、
インクルードファイルに以下を追加
D:\Project\lua5.1\include
D:\Project\luabind-0.8
ライブラリファイルに以下を追加します。
D:\Project\lua5.1\lib\static
・プログラム
これで準備ができたので、早速やってみます。
ゲームに使う予定なので、特定のクラスに関連付けた形でLuaファイルを読み込み、
読み込んだクラスのメンバ関数をLua側から呼び出すところまで。
とりあえず、あるクラスにLuaファイルをロードします。
//初期化関数
void test::Init()
{
L = lua_open();
if( luaL_dofile( L, "LuaTest.lua") != 0){
cout << lua_tostring( L, -1) << endl;
exit( -1);
}
luaL_openlibs( L);
luabind::open( L);
luabind::module( L) [
luabind::class_< test >( "test")
.def(luabind::constructor<>() )
.def( "test1",&test::test1)
.def( "test2",&test::test2)
.def( "test3",&test::test3)
.def( "Set",&test::Set)
];
luabind::call_function<void>( L, "Init");
}
testクラスの初期化関数です。
Lは、testクラスのlua_State*データメンバです。
lua_open関数でLを初期化します。
今回はLuaのソースをLuaTest.luaファイルに書いているので、luaL_dofile関数でロードします。
ロードできない場合は、エラーを出力して終了です。
その後のluaL_openlibsはおまじないのようなものです。
これでLuaの実行の準備ができました。
次に、Luaにtestのメンバ関数を登録します。
まずluabind::open関数を呼び出します。これもおまじないのようなものです。
次に、luabind::moduleですが、みれば分かると思います。というより、Cの文法じゃないので説明しづらいです。
testクラスは、引数なしコンストラクタと、test1(void)、test2(int)、test3(const char*)、Set(int)の関数があります。
ほかの関数はLua側からは使用しないので教えていません。
これはこう書くものだと覚えるしかなさそうです。
最後に、Lua側のInit関数を呼び出します。
返値がないのでcall_function<>の中はvoidです。
さて、下準備ができたので、Lua側からtestクラスのメンバ関数を呼んでみます。
方法は実に簡単です。
以下の関数を見てください。
//実行関数
void test::Execute()
{
luabind::call_function<void>( L, "Execute", this);
}
LuaのInit関数を呼んだときとと同じように、call_functionを使用します。
引数は可変なので、Lと関数名の後に第一引数から書いていくのですが、ここでthisポインタを渡します。
このthisポインタを使用して、Lua側からメンバ関数を呼び出してもらいます。
ちなみにLua側はこんな感じ。
//LuaTest.lua(抜粋)
function Execute( e);
e:test1();
e:test2( 33);
e:test3( "hogehoge");
end
※まださわったばかりなので、おかしいところがあるかもしれません。大丈夫そうでした。
とりあえずメモなのでいろいろ試してから後日追記予定。
参考に全ソースアップロードしておきました。
ほとんど何もしていませんが、参考にどうぞ。
ダウンロード