2011-09-20 32 views
9

(追記:これはゲームプログラミングである)LuaBindを使用してのLuaへLuaBind:クラスの特定のインスタンスをLuaにバインドする方法は?

バインディングクラス全体が簡単です:

class test 
{ 
    test() 
    { 
     std::cout<<"constructed!"<<std::endl; 
    } 

    void print() 
    { 
     std::cout<<"works!"<<std::endl; 
    } 
} 

//どこか

module[some_lua_state] 
    [ 
     class_<test>("test") 
     .def(constructor<>()) 
     .def("print",&test::print) 
    ]; 

今、私はクラスのインスタンスを作成することができますLuaで使用して:

lua_example.lua

foo = test() //will print "constructed!" on the console 
foo:print() //will print "works!" on the console 

しかし、私はtestの特定のインスタンスをLuaにバインドしたいと思います。これにより、オブジェクトをLuaに渡すことができます。プレイヤークラスのインスタンスとような何か:ハードの道を行くと、対応するC++ SetPosition関数はSTDをルックアップするために必要

SetPosition("Player",200,300) 

のようなものを持つとは対照的に

Player:SetPosition(200,300) 

を: :マップは、プレーヤーを見つける。

これも可能ですか?もしそうなら、私はLuaBindでどのようにすることができますか?

答えて

18

クラスのインスタンスをLuaにバインドしません。クラスのインスタンスは単なるデータであり、通常の方法でデータをLuaに渡すことができます。 C++オブジェクトは特別ですが、彼らはLuabindを通じて登録されているので、Luabindメソッドを使用してLuaスクリプトにそれらを提供する必要があります。

データをLuaに渡す方法はいくつかあり、Luabindはそれらをすべてカバーしています。たとえば、オブジェクトx(ルーバインドに登録されているクラスXへのポインタ)がある場合、Luaに与えることができるいくつかの方法がありますx

xの値をグローバル変数に設定できます。これはLuabindのobjectインタフェースを介して行われ、globals機能さ:

luabind::globals(L)["NameOfVariable"] = x; 

もちろん、あなたがグローバルな状態からアクセス可能な別のテーブルに住んでいる別のテーブル、など、でそれを置くことができます。しかし、テーブルがすべて存在することを確認する必要があります。

このデータをLuaに渡す別の方法は、Lua関数を呼び出してパラメータとして渡すことです。 luabind::objectインターフェイスを使用してオブジェクトとしての機能を取得し、次にluabind::call_functionを使用して呼び出すことができます。関数にパラメーターとしてxを渡すことができます。また、lua_pcallスタイルの構文が好きな場合はluabind::objectxをラップし、luabind::object::pushでスタックにプッシュできます。

+1

あなたがそれに答えてから数時間が経ちましたが、もう一度感謝します。 luabind :: globalsは非常に簡単です。また、luabindはC++のテンプレートメタプログラミングの新しいレベルへの私の敬意を高めました。 – TravisG

関連する問題