【问题标题】:LuaBind: How to bind specific instance of class to Lua?LuaBind:如何将类的特定实例绑定到 Lua?
【发布时间】:2011-11-20 23:30:34
【问题描述】:

(旁注:这是游戏编程)

使用 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 中做到这一点?

【问题讨论】:

    标签: c++ lua luabind


    【解决方案1】:

    您不会将类的实例绑定到 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 将其压入堆栈。

    【讨论】:

    • 您已经有几个小时没有回答了,但再次感谢。 luabind::globals 让这一切变得非常非常简单。 luabind 也将我对 C++ 模板元编程的尊重提升到了一个新的水平。
    猜你喜欢
    • 2013-07-08
    • 2014-08-05
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    相关资源
    最近更新 更多