Как написать сценарий для интерактивного NPC, имеющего диалог и меню в LUA с C ++? - PullRequest
0 голосов
/ 25 января 2019

Я работаю над двумерным игровым движком на C ++ и думал о переносе скриптов 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 голосов
/ 28 января 2019

Я согласен с @Blaze и в качестве ответа буду использовать сопрограммы. Тогда возникает вопрос, когда и как обернуть сценарии Lua в сопрограммы.

Простая упаковка каждого скрипта в собственную сопрограмму может * потерять вам некоторую производительность, но если большинство ваших скриптов длиннее, чем несколько строк, это не должно быть очень заметно. Помимо проблем со скоростью вы должны иметь в виду, что в 5.1 coroutine.running() тогда не вернется nil даже на верхнем уровне скрипта, потому что это также просто сопрограмма. В 5.3 это меньше проблем, так как всегда возвращает поток плюс логическое значение.

* Вам нужно будет провести сравнительный анализ, если это вообще имеет отношение

Следующий большой вопрос будет заключаться в том, делать ли обтекание в Lua или в C (++). Lua, очевидно, более гибок и его легче изменить, но C может принести вам некоторую производительность, которая редко бывает такой же актуальной, как при разработке игр. Очевидным недостатком является то, что использовать C API просто неудобнее.

Самая важная проблема заключается в том, что вы не можете (или не должны) просто реализовать, например, next() как обертку вокруг coroutine.yield('next') или что-то в этом роде, потому что у вас могут быть вложенные сопрограммы; поэтому вам понадобится больше логики для передачи вызовов API на верхний уровень, а затем в C ++.

Надеюсь, это даст вам хороший обзор наиболее важных соображений при принятии решения о том, стоит ли использовать сопрограммы для этой проблемы.

...