LuaBind:如何将特定的类实例绑定到Lua?

时间:2011-09-20 10:39:46

标签: c++ lua luabind

(旁注:这是游戏编程)

使用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-class的一个实例,并执行以下操作:

Player:SetPosition(200,300)

而不是采取艰难的方式并且有类似

的东西
SetPosition("Player",200,300)

其中相应的C ++ SetPosition函数需要查找std :: map才能找到播放器。

这是否可能,如果是这样,我怎么能在LuaBind中做到这一点?

1 个答案:

答案 0 :(得分:18)

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

有几种方法可以为Lua提供数据,Luabind可以涵盖所有这些方法。例如,如果你有一个对象x,它是一个向Luabind注册的类X的指针,那么有几种方法可以给Lua x

您可以将x的值设置为全局变量。这是通过Luabind的object接口和globals函数:

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

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

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