ПрограммированиеФорумОбщее

Организация событий в игре.

#0
9:48, 9 окт 2013

Подскажите насчет того как можно организовать систему событий в игре, в пример привожу такую ситуацию... игрок контактирует с предметом, запускается событие, на экран выводится диалоговое окно и текст, после того как игрок прочитал его, происходит следующее событие, к примеру персонаж автоматически должен следовать по какому-то пути... и тому подобное.

Как вообще реализовывается такое в играх? У меня возникают такие мысли...
Есть скрипт, в нем описаны действия, когда персонаж контактирует с предметом открывается скрипт и читается последовательность функций...

Псевдокод скрипта:
push_event(READ_TEXT, "текст события...");
push_event(READ_TEXT, "текст события...");
push_event(MOVE_CHR, "имя персонажа", 100, 100);

Эти функции пишутся в стек и последовательно выполняются, то есть в коде ищется то к чему относится событие, далее выполняются функции присущие этому событию, после того как функция выполнилась, она удаляется со стека и выполняется следующая.

#1
11:25, 9 окт 2013

язык какой?

#2
11:40, 9 окт 2013

zakol94
Так а в чем вопрос - как реализовать такой стек или что?

#3
11:47, 9 окт 2013

Kartonagnick
C++\Lua.

nes
Реализовать такой стек не проблема, просто хочу понять как лучше всего организовать события и правильно ли.

#4
12:00, 9 окт 2013

zakol94
Мне уже как-то советовали ранее ввести понятие задач в систему, которые могут крутиться в очереди и выполнять всякие действия. Далее вводим понятие события, которое мы можем сгенерировать в любом месте программы (у меня это синглентон). На событие можно подписать задачу, задача может генерировать событие. Цикл замкнулся. Из скриптов просто делаем доступ к генерации события. Скрипты сами можем засовывать в задачи.

#5
18:11, 9 окт 2013

Сначала в нижнем леере обрабатывается событие столновения, хоть рассылка, хоть подписчик, после чего обработчик собирает информация логическую об объекте и генерит событие он логическом взаимодействии, хоть рассылкой хоть через подписку.

#6
19:35, 9 окт 2013

Я у себя буду пробовать таймеры (и не только) с функцией по окончанию

-- 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.

#7
3:02, 10 окт 2013

У себя до этого делал так:

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. Выполняется след. функциональный объект.

Функция чтения текста.

+ Показать
ПрограммированиеФорумОбщее

Тема в архиве.