Представлю на суд громадськості свою реалізацію машини станів, також відому як кінцевий автомат. Машина станів приваблива тим, що обробляє логіку поведінки об'єкта в заздалегідь налаштованому алгоритмі, що вкрай необхідно для складних об'єктів. У статті приведу логіку об'єкта, що використовується в моїй грі Tropic Defense.
Машина станів це сутність, що складається з кінцевого набору станів об'єкта з правилами переходу між цими станів. Можна виділити три частини кінцевого автомата:Стан об'єкта (State): Якщо просто, то це те, що в поточний момент відбувається з об'єктом. Ящик може лежати, котитися, падати. Це їхні капітали. Внесу новий термін - State. для опису програмної реалізації стану. State повинен знати як реагувати на різні події, це його першочергове завдання.
Подія (Event): Для того ж ящика події можуть бути: штовхнути, зіткнутися з землею, скотитися з опори. Події (Event) потрібні для оповіщення машини станів, що з об'єктом щось сталося. Якщо ящик лежить і його штовхнули, то він покотитися. Це перехід зі стану «лежати» в «котитися» за подією «поштовх».
Менеджер станів (Machine): На ньому лежить вся логіка обробки подій, переходу станів, оповіщення про зміну стану об'єкта.
Проста реалізація може виглядати наступним чином:
Перша подія буде оброблено, але реакції на нього не буде. Наступні дві події успішно відпрацюють, помінявши стану в об'єкта. Код наведено простий з мінімальною кількістю перевірок, суто в показових цілях. Це дуже простий приклад, є два стани і два переходи між ними.
Наступний приклад буде набагато складніше, але таким же легким в управлінні. Наведу схему логіки гармати для гри жанру Tower Defense:
Всього 6 станів:
1. Сон. Гармата чекає ворога, в цей момент з нею нічого не відбувається.
2. Підготовка до бою. Наприклад підняття знарядь.
3. Підготовка до сну. Зворотне стан до «підготовка до бою», опускаються знаряддя.
4. Режим вогню. Розстрілює патрони по ворогу.
5. Перезарядка, заряджаються знаряддя.
6. Очікування наступної мети, включається коли ворог убитий.
6 подій:
1. Виявлено мета.
2. Знаряддя готові.
3. Перезарядити знаряддя.
4. Цілі немає.
5. Відпочивати.
6. Спати.
8 переходів:
1. Сон-підготовка.
2. Підготовка-стрілянина.
3. Стрільба-перезарядка.
4. Перезарядка-стрілянина.
5. Стрільба-очікування мети.
6. Очікування мети-стрілянина.
7. Очікування-підготовка до відпочинку.
8. Відпочинок.
Налаштувавши логіку гармату згідно зі схемою, управління для неї зводитися до двох команд: «capture target» і «release target». Все інше гармата зробить вже сама.
Вихідний код: State Mashine Example
Машини станів: FiniteStateMachine.h, FiniteStateMachine.cpp
Приклад використання для вищеописаної гармати: MachineShoot.h, MachineShoot.cpp
Код можна подивитися, скачати, використовувати на свій розсуд.