如何使用 C++ 在 LUA 中编写具有对话和菜单的交互式 NPC 脚本?
How to script an interactive NPC having dialogue and menus in LUA with C++?
我正在使用 C++ 开发 2D 游戏引擎,并考虑将 NPC 脚本(例如对话和菜单选择项)移至 LUA。我很难弄清楚如何等待 user/client 的响应。我的场景如下-
- 用户点击 NPC。
- NPC发起对话window,玩家无法移动。 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()
would then not return nil
even in the top level of the script, because that's also just a coroutine. In 5.3 中这不是什么问题,因为它总是 returns 一个线程加一个布尔值。
* 如果这完全相关,您需要进行基准测试
下一个大问题是是在 Lua 中还是在 C(++) 中进行包装。 Lua 显然更灵活且更容易更改,但 C 可能会为您带来一些性能,这很少像开发游戏时那样重要。明显的缺点是 C API 使用起来更不方便。
但最重要的问题是,您不能(或不应该)仅仅将 next()
实现为 coroutine.yield('next')
或类似的东西的包装器,因为你可能有嵌套的协程;所以你需要更多的逻辑来将你的 API 调用传递到顶层,然后传递到 C++。
我希望这能让您很好地了解在决定是否使用协程解决此问题时最重要的考虑因素。
我正在使用 C++ 开发 2D 游戏引擎,并考虑将 NPC 脚本(例如对话和菜单选择项)移至 LUA。我很难弄清楚如何等待 user/client 的响应。我的场景如下-
- 用户点击 NPC。
- NPC发起对话window,玩家无法移动。 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()
would then not return nil
even in the top level of the script, because that's also just a coroutine. In 5.3 中这不是什么问题,因为它总是 returns 一个线程加一个布尔值。
* 如果这完全相关,您需要进行基准测试
下一个大问题是是在 Lua 中还是在 C(++) 中进行包装。 Lua 显然更灵活且更容易更改,但 C 可能会为您带来一些性能,这很少像开发游戏时那样重要。明显的缺点是 C API 使用起来更不方便。
但最重要的问题是,您不能(或不应该)仅仅将 next()
实现为 coroutine.yield('next')
或类似的东西的包装器,因为你可能有嵌套的协程;所以你需要更多的逻辑来将你的 API 调用传递到顶层,然后传递到 C++。
我希望这能让您很好地了解在决定是否使用协程解决此问题时最重要的考虑因素。