首页 > 解决方案 > 如何在不停止主循环的情况下实现对话系统?

问题描述

我有兴趣实现一个类似于这里正在做的对话系统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 代码片段中得出的结论是,该代码非常易于编写和遵循,我希望使用类似的方法。我想知道的是如何在等待选择时不停止引擎代码的情况下实现这一点。

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

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

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

标签: c++multithreadinglua

解决方案


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

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

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


推荐阅读