【问题标题】:Returning an instance of a C++ object in Lua 5.2?在 Lua 5.2 中返回 C++ 对象的实例?
【发布时间】:2013-10-22 00:32:55
【问题描述】:

我查看了多个来源,但我只是不明白它们。大多数情况下,它们要么使用像 luaBind 这样的库(我不想使用它,因为它依赖于 Boost),要么它们不是 C++ 中的实例对象,而是直接在 Lua 中创建的。

我有一个 Player 类,它封装在另一个类中来处理 Lua 调用。我在应用程序的初始化中创建了这两个对象的 std::vector 列表。

所以基本上我不希望 Lua 脚本创建这些播放器对象,我只想创建一个函数 getPlayer(),然后返回 Lua 包装的对象。我不知道从哪里开始定义 Lua 包装对象以供 Lua 调用,也不知道如何将对象的实例返回给 Lua,以便我可以使用它的调用。

这是我希望我的 Lua 脚本看起来像的示例:

player = getPlayer(1) -- Returns the Lua wrapped object from C++ where 1 is the object's index in the std::vector list
print("Player's name: ", player:name()) -- Print's the player's name

有人能给我指出一个体面的教程来解释如何做到这一点。我很确定这不是某种“从未做过,你为什么要这样做”的案例,所以肯定至少有一个教程在那里。我已经搜索了大约 2 天,没有任何阳性结果。

【问题讨论】:

  • LuaBridge 不依赖于 Boost。它的手册解释了很多关于在 Lua 和 c++ 之间共享对象生命周期的陷阱

标签: c++ lua


【解决方案1】:

这不是Never been done 的任务,但是他们使用 Lua 的公司已经对 Lua 的原始源进行了大量的更改和改进,以使其适合他们想要的位置。由于我们所有的程序员在第三方资源上做这些事情都不是那么酷,所以我们必须使用那里存在的任何东西。您认为 Crytek 使用的 Lua 版本与其网站存储库中的版本完全相同吗?没有先生。

您可以使用userdata 来实现这一点。或者您可以使用meta tables。还有另一段名为Luna 的代码可以帮助您更快地实现。

否则,这都是 Luabind,相信我,你最终会以一种或另一种方式使用它。此外,它对 Boost 的使用并不广泛,最终的可执行文件只会增加 200kb。如果您想在某个时候使用 Luabind,请查看此地址,这确实是网络上的一篇好文章。 http://blog.nuclex-games.com/tutorials/cxx/luabind-introduction/

如果你对 Lua 太无聊了,我可能会建议你使用 squirrel 作为 Lua 的替代品。就个人而言,我更喜欢 squirrel 而不是 Lua,因为它类似于 C 的语法和我们想要的能力。此外,您甚至可以在其上下文中声明常量并使用真正的类,而 Lua 在这方面非常失败。 squirrel 的有趣之处在于,设计师是他一直致力于 FarCry 开发 Lua 引擎的人。

【讨论】:

  • 非常感谢,我刚刚研究了LuaBridge,到目前为止,我已经以最小的努力让它工作了。我可能在某个时候不得不求助于 Luabind。再次感谢他们提供的资源,它们看起来会极大地帮助我。
  • @Zinglish LuaBridge 也是一个不错的选择。看看这个页面:realmensch.org/blog/fun-lua-bindings。这确实是为 Lua 选择良好绑定库的好来源。
猜你喜欢
  • 2013-01-15
  • 2015-02-07
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多