2

我查看了多个来源,但我只是不理解它们。大多数情况下,它们要么使用像 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 天,没有积极的结果。

4

1 回答 1

1

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

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

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

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

于 2013-10-21T16:16:46.187 回答