Как реализовать диалоговую систему, не останавливая основной цикл? - PullRequest
0 голосов
/ 08 мая 2018

Я заинтересован во внедрении системы диалога, аналогичной тому, что делается здесь 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 голосов
/ 08 мая 2018

Обычно вы запускаете код блокировки в потоке Lua (сопрограмма).

Ваш choose{} вызов будет внутренним, и приложение будет периодически возобновлять этот поток при внешних событиях (ввод / рендеринг / что угодно). Таким образом, вы можете иметь основной цикл, работающий свободно, получая результаты этого диалога на ближайшей итерации после того, как диалог будет готов.

Объект, обслуживающий вызов choose{}, может вызвать некоторое событие при завершении, которое может отслеживаться большей системой приложения, той же системой, которая будет ожидать завершения других асинхронных задач (загруженный файл, запрос http и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...