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

How to script an interactive NPC having dialogue and menus in LUA with C++?

本文关键字:菜单 交互式 脚本 NPC 对话 C++ 何用 编写 LUA      更新时间:2023-10-16

我正在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()函数将向客户端发送下一个按钮。在此之后,脚本暂停并等待用户的输入。单击下一个按钮后,脚本将继续,向客户端发送菜单。选择后,它会继续进入条件子句或不进入条件子句,具体取决于选择。

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

在卢阿实现这一目标的好方法是什么?如果您对最佳实践有建议,我也将不胜感激。

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

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

*如果这是所有相关的,你需要进行基准测试

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

然而,最重要的问题是,您不能(或不应该)仅仅实现next(),例如将其作为coroutine.yield('next')的包装器或类似的东西,因为您可能有嵌套的协程;因此,您需要更多的逻辑来将API调用传递到顶级,然后传递到C++。

我希望这能让你很好地概述在决定是否使用协程来解决这个问题时最重要的考虑因素。