Машина состояний
Машина состояний - это именованный набор всех возможных состояний некого объекта и правила перехода между ними (Конечный автомат)
Для игр очень удобно использовать машины состояний, потому что, как правило игра имеет четкие выраженные состояния (игровой процесс, меню, игра окончена и так далее).
Набор состояний можно представлять в игре по разному, например если всего возможны два состояния (игра и gameOver), то достаточно использовать bool переменную. Но если состояний больше, то либо придется вводить больше bool переменных, в которых будел легко запутаться, либо задавать целочисленную переменную int state с кодами состояний 1, 2, 3 (что является анти-паттерном магические числа) в которых тоже будет легко запутаться, поэтому, как правило , вводят именнованные константы, с которыми код становится понятным и читаемым.
Машину состоний в программирование удобно задавать именованными константами с помощью перечислений
Примеры простейших машин состояний игры:
enum GameState {
Idle, // процесс игры
GameOver // игра окончена
}
enum GameState {
PlayerMove, // ход игрока
ComputerMove, // ход компьютера
GameOver // игра окончена
}Также машина состояний может быть у отдельных юнитов или спрайтов (для анимации):
enum UnitGameState {
Idle, // юнит стоит без дейстивий
Move, // юнит передвигается
Attack, // юнит атакует
Harvest // юнит добывает ресурсы
}
Разные машины состояний обычно влияют на две основные вещи:
1. Рендеринг (то что отрисовывается на экране)
Например, в режиме GameOver (игра окончена) выводится затемнение всего экрана и надпись Game Over. На заднем фоне в это время может происходить анимация как раньше
При состоянии PlayerMove отрисовывается видимая часть карты где расположена база игрока, а при состонии ComputerMove как правило его ход не показывается если место на карте где перемещается противник еще не разведано игроком (туман войны)
2. Управление (Как обрабатываются нажатия мышки и клавиатуры)
Например, в состоянии GameOver, обычно прекращается возможность совершать ходы и управлять юнитами, т.е. обработка клавиш и мышки происходят уже по другой логике отличной от основной игры
При состоянии PlayerMove нажатие мышки означает что ход совершает игрок, при состоянии ComputerMove нажатие кнопок мыши игрока игнорируется