Руководство по FSM
Материал из ArmaCommandReference Wiki
Содержание[показать] |
[править] Что такое FSM
FSM – расшифровывается, как Finite State Machine и означает «конечный автомат». По определению компании Bohemia Interactive, FSM – это набор состояний игровой логики, переходящих из одного состояния в другое по определенным правилам.
FSM
можно использовать для различных ситуаций, вплоть от назначения музыки
зависящей от ситуации (например во время боя одна, в спокойное время
другая) и до указания ботам, как необходимо вести себя в той или иной
ситуации.
Полёт мыслей, может ограничиваться только вашей фантазией.
править Программа FSM Editor
С выходом игры ArmA 2, компания Bohemia Interactive выпустила свой инструментарий для редактирования FSM файлов. Здесь я подробно, постараюсь, рассказать об этой программе.
Скачать программу можно по этим адресам:
[править] Обзор программы
[править] Интерфейс
Открывая первый раз эту программу, очень легко запутаться. Множество
непонятных кнопок, настроек, параметров. Сейчас мы эту непонятливость,
будем устранять.
Рассмотрим самую верхнюю панель настроек:
Обладая даже начальными знаниями английского языка, суть этих пунктов
не окажется очень сложной. Я остановлю своё внимание только на пункте FSM Attributes, о котором поговорим чуть позже.
Следующее меню:
Это панель форматирования. Шрифт, цвет, подчёркивание, выравнивание, размер шрифта и пр.
Сейчас добрались до самого интересного. Панелей настройки состояний.
Описание будет сверху-вниз.
- Создание нового состояния (New Box);
- Перемещение выбранного состояния (Set mode to design);
- Создание переходов от состояния к состоянию (Draw links);
- Увеличить масштаб (Zoom);
- Вернуть масштаб (Reset Zoom);
- Изменить внешний вид блока (Change item to…);
- Залить блок цветом (Set fill colour);
- Изменить цвет границ (Set line colour);
- Установить размер и стиль текста (Set line style and width);
- Set transparent fill;
- Set transparent line;
- Редактировать текст в состоянии (Edit text and font properties);
[править] Описание блоков
Так же идёт сверху-вниз.
- Начальное состояние. Активируется при запуске fsm;
- Блок условие. Проверяет условия перехода от блока к блоку с учётом приоритета;
- Блок состояние. В этом блоке пишутся скрипты;
- Блок точка. Просто удобная штука, позволяет более грамотно распределять блоки;
- Блок завершение. Блок, который завершает fsm файл;
править Настройка FSM
Наш .FSM перед работой необходимо настроить! Потому что если это не сделать, появляется вот такая ошибка при компиляции fsm:
Есть несколько программных настроек:
Каждая из них нужна для определённой работы. Описания этих настроек будут приведены ниже.
[править] Управляющие настройки
- FSM Entity – управляющий файл entityFSM.cfg
Такая настройка используется для описания поведения определённых животных (бабочки, пчёлы, стрекозы);
- FSM Scripted – управляющий файл scriptedFSM.cfg
Настройка, позволяющая использовать скриптовые команды и условия в fsm файлах.
- Global Switch FSM – управляющий файл globalSwitchFSM.cfg
Compilation to the *.cpp code, using switch to navigate through FSM states. The compile uses many FSM attributes, to define function declaration, precondition codes etc. This FSM was first used in seagull.cpp to code autopilot functionality. So, opening seagull.cpp in FSMEditor.
- Class Compile FSM – управляющий файл classFSMcompile.cfg
Compilation to the *.cpp, using Fsm class architecture. It
creates %(stateName) functions for state initialization and
check%(stateName functions for checking conditions. No FSM created by
FSMEditor has been compiled and used in engine, but some were coded
manually before FSMEditor existence.
Чтобы выбрать интересующую нас настройку, щёлкаем по выделенным пунктам:
Откроется меню:
Теперь надо выбрать путь, по которому установлена программа FSM Editor.
При правильном выборе должно появиться несколько файлов с расширением .cfg
Это конфигурационные файлы настройки .FSM
Выбираем нужную и начинаем с ней работать.
[править] Особенности FSM
- Кириллица запрещена в описаниях блоков, но разрешена в самих блоках (UTF-8).
- Передача аргументов в FSM файл не отличается от передачи аргументов в SQF файл.
- Все локальные переменные, описанные в .FSM файле, будут доступны во всех блоках.
- FSM не будет выполнятся дальше, пока какое-либо условие не будет выполнено.
- Команда sleep в FSM запрещена, вместо этого используется метод засечки времени. Чтобы сделать задержку, нужно запомнить время (_wait = time) и поставить условный блок, в котором обозначить условие: (time > (_wait + 10), например для 10 секундного ожидания.
[править] Работа с FSM
Каждый .fsm файл должен начинаться с начального состояния (Start State) и заканчиваться конечным состоянием (End State). Чтобы выбрать тип блока, нужно всего-то щёлкнуть правой кнопкой мыши на интересующем блоке.
Начальный блок отмечается красным цветом. Конечный – оранжевым. Рабочим полем для нас будет являться закладка initCode
В этом поле мы будем писать наши скрипты.
[править] Примеры работ
Все примеры работы с fsm файлами я буду производить с настройкой - FSM Scripted.
править Пример 1
Ветвление
В миссии я захотел обработать два события. Для этого написал простенький .fsm скрипт.
Блок «начало» (Start State) инициализирует вход в .fsm файл. Затем идёт разветвление на два условия. Первое: Игрок убил человека, второе – игрок сел в машину. Инициализация .fsm происходит в скрипте init.sqf
FSM становится _активным_ и ждёт реакции по событиям. Что из этого получилось, смотрите в примере.
Скачать архив
править Пример 2
Приоритет FSM
Сейчас я вам покажу зависимость выполнения fsm от приоритета.
FSM - скрипт представляет собой блок состояний с разветвлением с учётом приоритета.
Инициализация FSM так же происходит в скрипте init.sqf.
Условие «Убит юнит 1» имеет приоритет 0, условие «Убит юнит 2» имеет приоритет 1.
Следовательно, если будет убит только юнит 1, fsm пойдёт по одной ветке с выводом первой подсказки, описанной в коде. Если будет убит только юнит 2, fsm пойдёт по второму пути, с выводом второй подсказки. Если же оба юнита будут убиты одновременно, fsm пойдёт всё по тому же второму пути (условие: убит юнит 2), так как, оно имеет больший приоритет и выведет третью подсказку.
Можете поиграться с приоритетом, внутри fsm файла.
Скачать архив
править Пример 3
Поиск статических орудий
Это уже более сложный пример. В нём я попытался имитировать поведение солдат, при поиске свободных статических орудий.
Скачать архив
[править] Часто возникающие ошибки
1) Вопрос: При компиляции у меня появляется такая ошибка:
Ответ: Эта ошибка вызвана из-за того, что вы не настроили свой fsm файл.
Как избежать возникновения данной ошибки, читайте выше, в пункте «Настройка ФСМ»
2) Вопрос: При компиляции возникает след. ошибка:
Ответ: Данная ошибка связана с размещением блоков. Скорей
всего вы поставили два одинаковых состояния, о чём программа в логе и
сообщила: <There is unspecified condition between two states>.
Выглядит это так: