Что я делаю примерно так:
У меня есть структура данных ориентированного ациклического графа , которая, по сути, представляет собой просто набор узлов, которые указывают друг на друга. Каждый узел представляет игровую систему. например, пользовательский интерфейс, мир, вход, рендеринг. И каждый узел указывает на другие узлы, которые идут до или после него. После того, как все узлы на месте, легко сгладить их в простой список. Настройка DAG - это первое, что я делаю при запуске игры. Каждый раз, когда я хочу добавить новую систему, скажем, AI, я могу просто написать этот код, а затем рассказать моей игре, от чего он зависит и что должно зависеть от него.
Мой основной игровой цикл идет после этого и просто запускает каждую систему по порядку. Сначала обрабатывается ввод, затем обновления мира, затем другие вещи ... Пользовательский интерфейс близок к концу, и рендеринг является последним. Когда игра только начинается, мира, физики и ИИ не существует, поэтому эти шаги, по сути, пропускаются, и отображается только титульный экран. Когда вы запускаете игру должным образом, пользовательский интерфейс отправляет сообщение мировой системе для включения, и он просто заботится о себе. Управление состоянием игры просто означает включение и выключение различных систем. Каждая система имеет свой собственный набор информации о состоянии, который обрабатывается более или менее независимо от всех других (это не совсемна самом деле, многие системы работают с одним и тем же набором данных - например, система пользовательского интерфейса берет данные из мира для отображения информации. Система ИИ также должна просматривать и отправлять сообщения объектам в мире).