Машина состояний

 

Машина состояний - это именованный набор всех возможных состояний некого объекта и правила перехода между ними (Конечный автомат)

Для игр очень удобно использовать машины состояний, потому что, как правило игра имеет четкие выраженные состояния (игровой процесс, меню, игра окончена и так далее). 

Набор состояний можно представлять в игре по разному, например если всего возможны два состояния (игра и 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 нажатие кнопок мыши игрока игнорируется