Fsm (finite-state machine) - види fsm, застосування fsm

Фактично, FSM це просто якийсь "автомат", який може мати якісь різні стани і в один момент часу може знаходитися лише в одному з цих станів. Наприклад, якщо ворог може просто ходити по рівню, може атакувати гравця, а так само може ховатися, то його поведінка легко задається за допомогою Finite-state machine з трьома станами: йду, атакую, ховаюся. Якщо ми опишемо дії, які повинен виконувати ворог в кожному з цих трьох станів, а потім будемо перемикати їх з якихось законам (або випадковим чином) - у гравця виникне відчуття, що ворог наділений якимось інтелектом.
FSM transition table
В іграх (та й не тільки) найчастіше описуються не тільки можливі стани FSM, а й правила (умови) переходу FSM з одного стану в інший. Найчастіше при проектуванні ці правила подаються у вигляді таблиці переходу станів і тому таблицю цю називають "state transition table", явно натякаючи на те, що вона задає як буде здійснюватися перехід (transition) з одного стану FSM в інше її стан. Ну, наприклад, проста таблиця FSM може виглядати так:
Працювати FSM по цій таблиці буде приблизно так:
Поточний стан: Прогулянка
Бачу ворога? Так. Переходжу в стан "Атака"
Поточний стан: Атака
Бачу ворога? Ні. Переходжу в стан "Прогулянка"
Поточний стан: Прогулянка
Бачу ворога? Ні. Чи не міняю стан.
Поточний стан: Атака
Бачу ворога? Так. Чи не міняю стан.
Іншими словами, FSM приймає дані (наприклад, дані про ігровому світі) і, грунтуючись на них, може змінювати (або не міняти) своє поточний стан.
FSM, вхід і вихід з станів
Для зручності роботи, зазвичай кожномустаном FSM так само задають 2 додаткових функції: функцію входу в стан і функцію виходу зі стану. Причин для їх використання можна знайти багато, я ж наведу лише одну: ці функції дозволяють "підготувати" об'єкт до входу в стан, або до виходу їх нього. Що б це не звучало банально, наведу кілька прикладів:
- При вході в стан "йду", ми можемо завантажити анімацію ходьби
- При виході зі стану "йду" ми можемо вивантажити цю анімацію, оскільки вона нам більше не потрібна
- При вході в стан "ховаюся" ми можемо запам'ятати: куди ми вирішили сховатися, від кого ми ховаємося, яким шляхом ми вирішили пройти в обрану нами точку-ничку)))
У разі, якщо ФСМ не є окремою сутністю, а є частиною об'єкта, часто додається ще одна функція - функція "виконання" стану. Наприклад, ця функція може перемикати "кадри" анімації, для отримання плавної ходьби або реалізовувати якийсь AI, або і те й інше разом.
Методи реалізації FSM
Є два найбільш часто вживаних методу реалізації FSM:
- Статичний FSM. Поведінка Finite-state machine визначається на стадії компіляції програми і не може змінюватися в runtime. Цей метод забезпечує найбільшу швидкодію і він простіше в реалізації.
- Динамічний метод реалізації FSM. Поведінка машини станів може змінюватися runtime шляхом додавання або видалення (включення / вимикання) можливих станів FSM. Набагато більш гнучкий метод, але він значно складніше в реалізації і використовується досить рідко.
Хочу підкинути вам ще одну цікаву статейку по реалізації статичної FSM - спробуйте розібратися, вам сподобається ідея.
Це все, що я хотів вам розповісти про FSM. У наступних уроках я покажу вам приклади реалізації ФСМ на C ++.
Ще по цій темі: