Подскажите насчет того как можно организовать систему событий в игре, в пример привожу такую ситуацию... игрок контактирует с предметом, запускается событие, на экран выводится диалоговое окно и текст, после того как игрок прочитал его, происходит следующее событие, к примеру персонаж автоматически должен следовать по какому-то пути... и тому подобное.
Как вообще реализовывается такое в играх? У меня возникают такие мысли...
Есть скрипт, в нем описаны действия, когда персонаж контактирует с предметом открывается скрипт и читается последовательность функций...
Псевдокод скрипта:
push_event(READ_TEXT, "текст события...");
push_event(READ_TEXT, "текст события...");
push_event(MOVE_CHR, "имя персонажа", 100, 100);
Эти функции пишутся в стек и последовательно выполняются, то есть в коде ищется то к чему относится событие, далее выполняются функции присущие этому событию, после того как функция выполнилась, она удаляется со стека и выполняется следующая.
язык какой?
zakol94
Так а в чем вопрос - как реализовать такой стек или что?
Kartonagnick
C++\Lua.
nes
Реализовать такой стек не проблема, просто хочу понять как лучше всего организовать события и правильно ли.
zakol94
Мне уже как-то советовали ранее ввести понятие задач в систему, которые могут крутиться в очереди и выполнять всякие действия. Далее вводим понятие события, которое мы можем сгенерировать в любом месте программы (у меня это синглентон). На событие можно подписать задачу, задача может генерировать событие. Цикл замкнулся. Из скриптов просто делаем доступ к генерации события. Скрипты сами можем засовывать в задачи.
Сначала в нижнем леере обрабатывается событие столновения, хоть рассылка, хоть подписчик, после чего обработчик собирает информация логическую об объекте и генерит событие он логическом взаимодействии, хоть рассылкой хоть через подписку.
Я у себя буду пробовать таймеры (и не только) с функцией по окончанию
-- Lua timer(msDelay, luaCommand)
Диалог между NPC в этом случае будет отображаться примерно так
function showDialog(currMessageNo, luaCommand)
txt = getText(currMessageNo);
if (txt == nil)
-- Следующего сообщения нет
then
doString(luaCommand);
-- Показываем сообщение
else
setText(txt);
timer(2000, "showDialog("..currMessageNo + 1..", luaCommand)");
end;
end function
showDialog(0, "doSmthOnDialogEnd()")P.S. Всякие очереди и слушателей писать у меня умений не хватит, да и желания нет.
Хочется обойтись минимумом кода на С++, вынеся всё в Lua.
У себя до этого делал так:
1. Завел std::vector<std::function<int()>>, далее связал это с функциями на луа. В пример функция вывода текста помещается в очередь:
int wl_EventText(lua_State *lua) { const char *text = luaL_checkstring( lua, 3); int x = luaL_checknumber( lua, 1); int y = luaL_checknumber( lua, 2); std::function<int( )> call = std::bind( Reader, x, y, text); PushQueue( call); // помещает функциональный объект на очередь. (наш эвент) в std::vector<std::function<int()>> return 0; }
2. Далее где-то в менеджере логики игры вызывается стек, с функциональным объектами и если ф.о. возвращает положительное значение, значит функция завершена и удаляется с очереди.
3. Выполняется след. функциональный объект.
Функция чтения текста.
Тема в архиве.