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

时间:2019-01-25 07:27:46

标签: c++ lua client-server game-engine game-development

我正在使用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中实现此目标的好方法是什么?如果您有最佳做法的建议,我也将不胜感激。

1 个答案:

答案 0 :(得分:1)

我会同意@Blaze并接受协程作为我的答案。问题是,何时以及如何将Lua脚本包装为协程。

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

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

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

不过,最重要的问题是,您不能(或不应该)仅将next()实现为coroutine.yield('next')或类似内容的包装,因为您可能有嵌套的协程;因此您需要更多的逻辑,才能将API调用传递给顶层,然后传递给C ++。

我希望这能为您在决定是否针对此问题使用协同程序时提供最重要的注意事项的概述。