gpt4 book ai didi

c++ - 如何使用 C++ 在 LUA 中编写具有对话和菜单的交互式 NPC 脚本?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:03:53 25 4
gpt4 key购买 nike

我正在使用 C++ 开发一个 2D 游戏引擎,并考虑过将 NPC 脚本(例如对话和菜单选择项)移动到 LUA 中。我很难弄清楚如何等待用户/客户端的响应。我的场景如下-

  1. 用户点击 NPC。
  2. NPC 启动对话窗口,玩家无法移动。 LUA 脚本被读取并开始运行。示例:
mes("Hello! " .. PlayerName)
next()
reply = select("Would you like to do this?", "Or that?")
if reply == 1 then
mes("You chose: Or that!")
close()
end

现在,我希望脚本一次发送一条消息 mes,然后 next() 函数会向客户端发送下一个按钮。之后脚本暂停并等待用户的输入。单击下一个按钮后,脚本将继续,向客户端发送一个菜单。选择后,它是否会继续进入条件子句,具体取决于选择。

所有这些都是服务器端的,对话被发送到客户端。我想实现的是在等待客户端响应时的暂停功能。

在 Lua 中实现此目的的好方法是什么?如果您对最佳实践有任何建议,我也将不胜感激。

最佳答案

我同意@Blaze 的观点并选择协程作为我的答案。接下来的问题是,何时以及如何将 Lua 脚本包装到协程中。

只是将每个脚本包装到它自己的协程中可能* 会损失一些性能,但如果您的大多数脚本都长于几行,这应该不会很明显。除了速度问题,您还必须记住 5.1 coroutine.running() 即使在脚本的顶层也不会返回 nil,因为那也只是一个协程。在 5.3这不是什么大问题,因为它总是返回一个线程加上一个 bool 值。

* 如果这完全相关,您需要进行基准测试

下一个大问题是是在 Lua 中还是在 C(++) 中进行包装。 Lua 显然更灵活且更容易更改,但 C 可能会为您带来一些性能,这很少像开发游戏时那样重要。明显的缺点是 C API 使用起来更不方便。

但最重要的问题是,您不能(或不应该)仅仅将 next() 实现为 coroutine.yield(' next') 或类似的东西,因为你可能有嵌套的协程;所以你需要更多的逻辑来将你的 API 调用传递到顶层,然后传递到 C++。

我希望这能让您很好地了解在决定是否使用协程解决此问题时最重要的考虑因素。

关于c++ - 如何使用 C++ 在 LUA 中编写具有对话和菜单的交互式 NPC 脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54360756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com