如何用C++编写LUA中具有对话和菜单的交互式NPC脚本
How to script an interactive NPC having dialogue and menus in LUA with C++?
我正在C++中开发2D游戏引擎,并考虑将NPC脚本(如对话和菜单选择项)移动到LUA中。我很难弄清楚如何等待用户/客户端的响应。我的场景如下-
- 用户点击NPC
- 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++。
我希望这能让你很好地概述在决定是否使用协程来解决这个问题时最重要的考虑因素。
- 无法获取菜单选择以运行函数.C++
- 与 stdio 同步是否使程序 I/O 非交互式?
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- C++ 中的图形菜单
- C++ 程序菜单使用做同时和切换
- 我正在尝试创建一个菜单,但我的代码一直在循环
- 触发另一个窗口的菜单按钮
- 从子菜单返回后,正确的输入至少进入验证循环一次
- C++ 我的开关格式中的循环不允许我显示菜单选项或接受输入?
- 如何为我的游戏设置主菜单场景?QT C++
- C++循环菜单时做
- 难以从 CImageList 设置菜单项位图
- 如何将我的程序添加到文件和文件夹的macOS右键单击菜单?
- 如何以编程方式显示功能区按钮的下拉菜单?
- 如何在win32的窗口类中设置动态菜单?
- 为什么我的 Do-while 循环无法在C++中运行菜单
- 我正在尝试用 c++ 制作菜单,但不明白为什么它不循环
- 如何使用IExecuteCommand和动词在上下文菜单外壳扩展中显示本地化文本和自定义图标?
- 连接资源文件中的字符串,并将其传递给菜单项字符串 (winapi) c++
- 如何用C++编写LUA中具有对话和菜单的交互式NPC脚本