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

LuaBind: How to bind specific instance of class to Lua?

本文关键字:实例 绑定 Lua LuaBind      更新时间:2023-10-16

(旁注:这是游戏编程)

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

Player:SetPosition(200,300)

而不是艰难地使用

SetPosition("Player",200,300)

中对应的c++ SetPosition函数需要查找std::map<std::string,Entity>查找播放器

这是可能的,如果是这样,我怎么能在LuaBind?

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

有几种向Lua提供数据的方法,Luabind涵盖了所有这些方法。例如,如果你有一个对象x,它是一个指向类X的指针,在Luabind中注册,有几种方法可以给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一起推入堆栈。