9

(補足:これはゲームプログラミングです)

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

ただし、ここで、特定のテストインスタンスをLuaにバインドしたいと思います。これにより、オブジェクトをLuaに渡すことができます。たとえば、Playerクラスのインスタンスを使用して、次のようなことを行うことができます。

Player:SetPosition(200,300)

苦労して何かをするのとは対照的に

SetPosition("Player",200,300)

ここで、対応するC ++ SetPosition関数は、プレーヤーを見つけるためにstd::mapを検索する必要があります。

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

4

1 に答える 1

18

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

Lua にデータを渡す方法はいくつかありますが、Luabind はそのすべてをカバーしています。たとえば、 Luabind に登録されているxクラスへのポインターであるobject がある場合、 XLua を指定する方法はいくつかありますx

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

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

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

このデータを Lua に渡す別の方法は、Lua 関数を呼び出してパラメーターとして渡すことです。インターフェイスを使用しluabind::objectて関数をオブジェクトとして取得し、使用luabind::call_functionして呼び出すことができます。xその後、パラメーターとして関数に渡すことができます。あるいは、 - スタイルの構文を好む場合は、 aでlua_pcallラップして、 でスタックにプッシュできます。xluabind::objectluabind::object::push

于 2011-09-20T11:30:31.863 に答える