忍者ブログ
ゲーム関連の話題に絞っていましたが、全然書かないのでいろいろ解禁してみたり。
[7]  [6]  [5]  [4]  [3]  [2]  [1
×

[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


※まださわったばかりなので、おかしいところがあるかもしれません。
とりあえずメモなのでいろいろ試してから後日追記予定。
大丈夫そうでした。

参考に全ソースアップロードしておきました。
ほとんど何もしていませんが、参考にどうぞ。
ダウンロード
 

PR
この記事にコメントする
お名前
タイトル
文字色
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
この記事へのトラックバック
この記事にトラックバックする:
Twitter
Twitter Update
ブログ内検索
カレンダー
05 2025/06 07
S M T W T F S
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
最新コメント
最新トラックバック
プロフィール
HN:
100poisha
性別:
非公開
アクセス解析
Copyright © 100poishaのブログ All Rights Reserved.
Designed by north sound
Powered by Ninja Blog

忍者ブログ [PR]