Ну, я знаю, что этот пост довольно старый, но я не удержался.
Я недавно построил игровой движок. Он использует сторонние библиотеки для рендеринга и физики, но я написал основную часть, которая определяет и обрабатывает сущности и игровую логику.
Двигатель, безусловно, следует традиционному подходу. Существует основной цикл обновления, который вызывает функцию обновления для всех объектов. О столкновениях напрямую сообщается обратным вызовом на объектах. Связь между объектами осуществляется с использованием интеллектуальных указателей, которыми обмениваются объекты.
Существует примитивная система сообщений, которая обрабатывает сообщения только небольшой группы объектов. Эти сообщения предпочтительно обрабатывать в конце игрового взаимодействия (например, создание или уничтожение сущности), поскольку они могут связываться со списком обновлений. Таким образом, в конце каждого игрового цикла используется небольшой список сообщений.
Несмотря на примитивную систему сообщений, я бы сказал, что система в значительной степени основана на цикле обновления.
Что ж. После использования этой системы, я думаю, что это очень просто, быстро и хорошо организовано. Логика игры является видимой и самодостаточной внутри сущностей, а не динамической, как сообщение quewe. Я действительно не хотел бы, чтобы это было обусловлено событиями, потому что, по моему мнению, системы событий вносят ненужную сложность в игровую логику и делают код игры очень сложным для понимания и отладки.
Но я также думаю, что у чистой системы, основанной на цикле обновления, как у меня, тоже есть некоторые проблемы.
Например, в некоторых моментах одна сущность может находиться в состоянии «ничего не делать», может ждать, когда игрок приближается, или что-то еще. В большинстве случаев сущность сжигает процессорное время впустую, и лучше выключить сущность и включить ее, когда происходит определенное событие.
Итак, в моем следующем игровом движке я собираюсь принять другой подход. Объекты будут регистрироваться для операций двигателя, таких как обновление, рисование, обнаружение столкновений и так далее. Каждое из этих событий будет иметь отдельные списки интерфейсов сущностей для реальных сущностей.