Здравствуйте уважаемые читатели моего канала, сегодня мы поговорим о паттерне состояние. Он часто используется в геймдеве для условия определения кода, который будет исполняться. Обычно это сводится к сложным и многоуровневым блокам без намека на полиморфизм. В этой статье мы познакомимся с еще одним поведенческим паттерном проектирования, который позволяет менять состояние объекта в зависимости от его состояния, создавая ощущение что поменялся целый класс. Для примера рассмотрим состояние по производству бензина из нефти.
В качестве входных данных у нее может быть 4 состояния. No OIL – ожидается поступление нефти, Has OIL – когда нефть поставили, Fuel Production – значит, что из нефти делается бензин и No Money – если денег нет и производство бензина пока невозможно. Теперь рассмотрим набор действий, которые система может выполнять.
Дать нефть, забрать её, запросить производство бензина, а дальше идет ветвление, если деньги еще есть, то можно опять ожидать нефть, а если нет, то ожидать деньги. На вид стандартный конечный автомат. Используем Enum для описание состояния, плюс одна переменная для хранения текущего состояния.
Для каждого действия отдельный метод и для текущего состояния будет меняться функционал. Добавить нефть можно только в состоянии NoOIL. В этом случае у игрока у игрока вычитаются нефть из баланса и изменяется текущее состояние. Все остальные состояние выведут сообщение об ошибке. Вернуть нефть можно только в состоянии HasOIL.