c++ - 如何在不停止主循环的情况下实现对话系统?
问题描述
我有兴趣实现一个类似于这里正在做的对话系统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 代码繁琐的情况下,有什么好方法可以解决这个问题?
解决方案
通常你会在 Lua 线程(协程)中运行阻塞代码。
您的choose{}
调用将在内部产生,并且应用程序将在外部事件(输入/渲染/其他)上定期恢复该线程。这样你就可以让主循环自由运行,在对话准备好后,在最近的迭代中从该对话中获取结果。
对象服务choose{}
调用可能会在完成时触发一些事件,这可能会被应用程序的更大系统监视,该系统将等待其他异步任务(文件加载、http 请求服务等)完成。
推荐阅读
- sql - 如何返回最近的值?
- c# - 强名称签名对此程序集无效
- flutter - 启动颤振应用程序时出错
- git - 如果其他分支已合并到主分支,如何将我的分支合并到主分支
- html - nodeJs运行时如何在浏览器中打开html文件
- typescript - 如何使用 ts 在 vue3 中将 ref 数据定义为类类型
- node.js - 本地 mongodb Node.js 服务器成功进行身份验证,然后在几秒钟后结束连接
- javascript - React Native / Redux - 获取字符串时响应返回为数组
- supervised-learning - 您能否构建一个模型,使用测试集规范化 FEATURES,同时避免数据泄漏?
- debugging - 找出应用程序在哪里等待