如何在不拖延主循环的情况下实现对话系统?

时间:2018-05-07 22:11:18

标签: c++ multithreading lua

我对实施类似于此处http://fungusdocs.snozbot.com/lua_controlling_fungus.html的对话系统感兴趣。

-- Display text in a SayDialog
say("Hi there")
say "This syntax also works for say commands"
-- Display a list of options in a MenuDialog
-- (Note the curly braces here!)
local choice = choose{ "Go left", "Go right" }
if choice == 1 then
    say("You chose left")
elseif choice == 2 then
    say("You chose right")
end

我从这个lua代码片段中得到的结论是代码很容易编写和跟随,我希望使用类似的方法。 我想知道如何在不等待选择的情况下停止引擎代码的情况下实现这一点。

函数调用选择{"向左走","向右走" } 返回一个值,这让我想说这是一个同步调用。由于我们调用引擎代码同步,然后我们停止引擎,但这个函数调用不应该直接回答问题 - 我相信它需要在常规主循环中回答,以免干扰其余的计划。

据我所知,解决这个问题的唯一方法就是依靠多线程。让脚本在一个单独的线程上处理,在选择调用上首先添加一个提示,然后等待提示被回答,获取结果,然后继续执行lua脚本。

在不使lua代码繁琐的情况下解决这个问题的好方法是什么?

1 个答案:

答案 0 :(得分:2)

通常你在Lua线程(协程)中运行阻塞代码。

您的choose{}调用将在内部产生,应用程序将定期在外部事件(输入/渲染/其他)上恢复该线程。这样你就可以让主循环自由运行,在对话框准备就绪后,在最近的迭代中从该对话框中获取结果。

服务choose{}调用的对象可能会在完成时触发某个事件,这可能会被应用程序更大的系统监视,该系统将等待其他异步任务的完成(文件加载,http请求)服务等)。