(旁注:这是游戏编程)
使用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中做到这一点?
答案 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
将其推入堆栈。