Логика основного цикла игры - PullRequest
0 голосов
/ 21 октября 2011

Я пишу игру на c ++, используя allegro 5. В Allegro 5 есть события, которые помещаются в очередь событий (например, щелчок мышью или отметка времени по истечении 1 / FSP).Итак, мой вопрос: какой должна быть логика основного цикла моей игры, или, поскольку он основан на событиях, я могу реализовать его без основного цикла ??

Есть идеи, как это делают реальные игры?Ссылки будут хорошими.

Ответы [ 2 ]

1 голос
/ 21 октября 2011

У меня нет опыта работы с Allegro, но при использовании SFML и рендеринга игры с OpenGL я сам опрашиваю очередь событий как часть моего основного цикла. Что-то вроде приведенного ниже псевдокода (но более абстрактного):

while(game_on)
{
   auto events = poll_occured_events();
   for_each(events, do_somewithng_with_event);

   render_game();
}

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

Вы можете (возможно) создать основной цикл в другом потоке, а затем синхронизировать его между потоком событий и потоком игры ...

0 голосов
/ 21 октября 2011

У меня нет опыта работы с Allegro, но логика будет такой же.

(так называемые) Реальные игры также имеют игровые циклы, но разница в том, что они используют потоки, которые работают параллельно, но в разные промежутки времени. Например, существуют разные потоки для физических вычислений, искусственного интеллекта, игрового процесса, звука, рендеринга ... поскольку пользовательские события обычно предполагают, что игровые события собираются до него (как предполагает Макс) и расходуются до следующего кадра (фактически некоторые собирают его в например 5 кадров).

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

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

вот несколько ссылок
игровой отрывок игрового движка
Игровые циклы на IOS

...