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() //在控制台上打印“constructed!”
foo:print()  //在控制台上打印“works!”

但是,现在我想将特定实例的测试绑定到Lua。这将使我能够将对象传递给Lua,例如Player类的实例并执行类似于以下内容的操作:

Player:SetPosition(200,300)

而不是用以下方式:

SetPosition("Player",200,300)

其中相应的C ++ SetPosition函数需要查找std :: map以找到Player。

这是否可能,如果是,我如何在LuaBind中执行它?

原文链接 https://stackoverflow.com/questions/7483809

点赞
stackoverflow用户734069
stackoverflow用户734069

你不能将类的实例与 Lua 绑定。类的实例只是数据,你可以通过通常的方式将数据传递给 Lua。但是 C++ 对象是特殊的,因为它们是通过 Luabind 注册的,所以你必须使用 Luabind 方法将它们提供给 Lua 脚本。

有几种方法可以向 Lua 提供数据,而 Luabind 则涵盖了所有这些方法。例如,如果你有一个指向已在 Luabind 中注册的类 X 的指针 x,你可以通过以下几种方式向 Lua 传递 x。

你可以将 x 的值设置为全局变量。这可以通过 Luabind 的对象接口和 globals 函数来完成:

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

很显然,你可以将其放在另一个表格中,该表格位于另一个表格中,等等,这些表格都可以从全局状态中访问。但你需要确保所有表都存在。

另一种传递数据给 Lua 的方式是调用 Lua 函数并将其作为参数传递。你可以使用 luabind::object 接口将函数作为对象获取,然后使用 luabind::call_function 来调用它。你可以将 x 作为参数直接传递给函数。或者,如果你更喜欢 lua_pcall - 风格的语法,你可以将 x 包装在 luabind::object 中,并使用 luabind::object::push 将其推入堆栈中。

2011-09-20 11:30:31