Про ECS
Освоившись с рендерингом, пришла пора связать это с игрой и научиться выводить объекты сцены на экран.
В основе игрового движка я решил использовать паттерн ECS (Entity-Component-System). Объекты сцены (entities) описываются во внешних конфигах, где перечисляются все их свойства (components). При запуске игры они загружаются и передаются на вход систем (systems), таких как рендеринг, физика, ввод и тд. В системах есть один общий метод process(), который раз за разом запускается в игровом цикле, за счёт чего и происходит изменение состояние игры: меняется кадр, положение объектов и тому подобное.
А вот кусочек того самого конфига, в котором описываются игровые объекты:
Поскольку каждая система отвечает только за какую-то одну отведенную ей функцию, то для совместной работы всех систем им нужен какой-то способ общаться между собой. К примеру, если мы хотим чтобы по нажатию на клавишу ‘W’ персонаж игрока начал бежать, то нам нужно чтобы система обработки ввода сообщила всем остальным, что начинается движение. В ответ на это, система, отвечающая за перемещение игровых объектов, изменит координаты персонажа, а анимационная система проиграет для него анимацию бега. В результате игрок увидит как его персонаж бежит.
Чтобы все это стало возможным, я добавил в game loop игры механизм под названием message bus. Это довольно простая штука, куда одни системы могут писать сообщения, чтобы другие могли их потом прочитать. Сообщения живут в рамках одной итерации игрового цикла, затем message bus очищается и все начинается по новой.