Какие хорошие методы обработки изменения состояния и состояния в разработке игр?

Я опытный разработчик, новичок в разработке игр, и я сделал достаточно простую, но работающую игру в 3D-платформер, и я ищу способы сделать архитектуру более масштабируемой.

Что является хорошим способом обработки состояния при разработке игр?
Очень наивный подход - иметь несколько булеантов типа:

time_stopped = True
time_slow_motion = False
level_loaded = True
level_paused = True
level_completed = False

Это очень негибко, так как ошибка разработчика может привести к time_stop = True и time_slow_motion = True в то же время, что разрушит логику игры.

Я ищу лучший подход в направлении:

class TimeState:
    STOPPED = 0
    SLOW_MOTION = 1
    NORMAL = 2
    current_state = 0

    def isStopped(self):
        if current_state == self.STOPPED: return True

Но как бы я хорошо справился с несколькими группами состояний? Я мог бы создать Уровневое государство , которое имело бы LOADED, PAUSED и COMPLETED состояния. Но как работать с перекрывающимися группами, например, когда LevelState и TimeState PAUSED должны быть всегда одними и теми же? Есть ли хороший шаблон проектирования или хорошая практика решения управления состоянием?

Что такое хороший способ обработки изменения состояния?
Я думаю либо дать объекту состояния, например, LevelState функции обратного вызова для выполнения при любом изменении состояния, либо опрашивать объект состояния в каждом цикле игры, как if level_state.changeTo() == LevelState.COMPLETED: doStuff(). Есть ли лучшие способы справиться с этим? Очереди сообщений/события? Я не хочу встраивать логику в объекты состояния.
Меня также интересует, нужно ли обрабатывать оба события changedFrom и changeTo, и что произойдет, если логика, вызванная изменением changeFrom изменит состояние объекта до срабатывания логики changedTo - кто выиграет?

Мне не нужны конкретные ответы на вопросы по реализации/языку, но советы по хорошему архитектурному мышлению.

8
задан Makoto 19 September 2016 в 19:28
поделиться