Автоматы, или Finite State Machines - это механизм управления поведением оружия, врагов и декораций. Для тех, кто помнит математику - это направленные графы. При помощи автоматов можно увеличить количество кадров в анимации, количество проигрываемых врагом или декорацией звуков, назначить любому кадру действие и т.д. Для добавления автомата необходимо создать файл с расширением .states и названием оружия, врага или декорации в папке Data/States.
При добавлении автомата, скорость атаки и перезарядки больше не будет зависеть от настройки в редакторе - все будет управляться лишь длительностью кадров, указанной в автомате. Помимо этого, все спрайты и (для оружия) часть звуков будет необходимо загрузить вручную, использовав команды image и sound
Базовый автомат для оружия:
image Weapon 0 7
sound WeaponFire
sound WeaponReload
state IDLE NONE 0
frame 1 0.25 0 0 0 NONE
frame 1 0.25 0 0 0 READY
state ATTACK IDLE 0
frame 2 1 0 0 0 NONE
frame 3 1 0 0 0 SOUNDANDATTACK 0
frame 4 1 0 0 0 MUZZLEFLASH
frame 5 1 0 0 0 READY
frame 6 1 0 0 0 NONE
frame 7 1 0 0 0 NONE
frame 1 0.25 0 0 0 NONE
frame 1 0.25 0 0 0 NONE
state RELOAD IDLE 0
frame 1 0 0 0 0 NONE
frame 1 0.1 0 0 0 NONE
frame 1 0.1 0 200 0 NONE
frame 1 0.1 0 200 0 RELOAD
frame 1 0.1 0 0 0 SOUND 1
Базовый автомат для врагов:
image Enemy 0 12
state IDLE NONE 0
frame 0 0.125 0 0 0 NONE
frame 0 0.125 0 0 0 READY
state WALK NONE 0
frame 1 1 0 0 0 NONE
frame 2 1 0 0 0 NONE
frame 3 1 0 0 0 NONE
frame 4 1 0 0 0 READY
state ATTACK WALK 0
frame 5 0.25 0 0 0 NONE
frame 5 0.25 0 0 0 NONE
frame 6 0.0625 0 0 0 NONE
frame 6 0.0625 0 0 0 ATTACK
frame 5 0.25 0 0 0 NONE
frame 5 0.25 0 0 0 READY
state HURT WALK 0
frame 7 0.125 0 0 0 NONE
frame 8 0.125 0 0 0 NONE
state DEATH DEAD 0
frame 9 0.166 0 0 0 NONE
frame 10 0.166 0 0 0 NONE
frame 11 0.166 0 0 0 NONE
state DEAD NONE 0
frame 12 0.125 0 0 0 NONE
frame 12 0.125 0 0 0 NONE
Базовый автомат для декораций:
image Decoration 0 3
state IDLE NONE 0
frame 0 0.25 0 0 0 NONE
frame 0 0.25 0 0 0 READY
state DEATH DEAD 0
frame 1 0.166 0 0 0 NONE
frame 2 0.166 0 0 0 NONE
frame 3 0.166 0 0 0 NONE
state DEAD NONE 0
frame 3 0.25 0 0 0 NONE
frame 3 0.25 0 0 0 NONE
Разберем по порядку:
image Decoration 0 3 - загружает спрайт и добавляет его в список. Нумерация начинается с 0. В данном случае команда загружает все спрайты с Decoration0 по Decoration3. Спрайты должны лежать в папке Data/Sprites/ и соответствующая папка энтити (Decorations/Enemies) или оружия(Weapons). Для оружия НЕОБХОДИМО загрузить кадр 0 (спрайт на полу).
image Decoration - загрузит один спрайт и добавит его в список.
sound WeaponFire - загрузит звук и добавит его в очередь. Нумерация начинается с 0. Звуки должны лежать в папке Data/Sounds.
state IDLE NONE 0 - создает новое состояние, где IDLE - имя состояния, NONE - состояние, к которому автомат перейдет после завершения (если NONE, то текущее состояние начнется заново), 0 (или 1) - следует ли интерполировать переход между состояниями (имеет смысл только с моделями).
frame 0 0.25 0 0 0 NONE - добавляет кадр в последнее созданное состояние, где 0 - номер спрайта, 0.25 - время, которое этот кадр будет проигрываться, 0 0 0 - координаты сдвига (имеет смысл только для оружия), NONE - действие (про них ниже).
Описанные в базовых примерах состояния обязательны к созданию. Самих состояний может быть сколько угодно, но следует учитывать, что враги передвигаются только в состоянии WALK. Кровь из врагов вылетает сама при переходе в состояние HURT.
Действия:
- NONE - пустое действие, не делает ничего.
- ATTACK - атака оружия или врага
- READY - устанавливает флаг готовности к атаке. Обязательно после атаки врага или оружия.
- SOUND 0 - проигрывает звук, где 0 - порядковый номер загруженного звука в списке.
- SOUNDANDATTACK 0 - объединяет в одном действии звук и атаку.
- SETVAR name value - устанавливает значение переменной. Вместо value можно поставить RANDOM(0,100), тогда переменной будет присвоено случайное значение от 0 до 100 (соответственно, границы можно менять). Здесь также можно использовать global и map переменные.
- INCREMENT name value - инкрементирует значение переменной, т.е. увеличивает на 1.
- DECREMENT name value - декрементирует значение переменной, т.е. уменьшает на 1.
- JUMPIFEQUALS variable value state - переходит к другому состоянию, если значение переменной равно указаному. Здесь также можно использовать global и map переменные.
- JUMPIFNEQUALS variable value state - переходит к другому состоянию, если значение переменной не равно указаному. Здесь также можно использовать global и map переменные.
- JUMPIFGEQUALS variable value state - переходит к другому состоянию, если значение переменной больше или равно указаному. Здесь также можно использовать global и map переменные.
- JUMPIFLEQUALS variable value state - переходит к другому состоянию, если значение переменной меньше или равно указаному. Здесь также можно использовать global и map переменные.
- JUMPIFGREATER variable value state - переходит к другому состоянию, если значение переменной больше указаного. Здесь также можно использовать global и map переменные.
- JUMPIFLESS variable value state - переходит к другому состоянию, если значение переменной меньше указаного. Здесь также можно использовать global и map переменные.
- JUMPIFLESSAMMO state - переходит к другому состоянию, если количество патронов в магазине меньше максимального (только для оружия).
- JUMPIFNOAMMO state - переходит к другому состоянию, если магазин пуст (только для оружия).
- GIVEAMMO - дает 1 патрон в магазин (только для оружия).
- TAKEAMMO - забирает один патрон из магазина (только оружие)
- RELOAD - перезаряжает оружие (полностью пополняет магазин. Только для оружия).
- MUZZLEFLASH - отображает вспышку от выстрела (только для оружия).
- SWAY - заставляет врага сменить направление на случайное (только для врагов).
- PARTICLES imageindex i,l,x,y,z dx,dy,dz - создает частицы. imageindex - номер спрайта, загруженного в автомате, i - количество частиц, l - время жизни частиц, x,y,z - координаты создания. При этом координаты зависят от поворота врага или игрока (если это оружие). x - в стороны, y - по вертикали, z - вперед-назад. dx,dy,dz - вектор скорости частиц. Зависит от поворота также, как и координаты создания.
- EXPLOSION name radius - создает взрыв с именем и радиусом (враги и декорации). Спрайты взрыва должны лежать в папке Data/Sprites/Effects (только враги).
- SPAWN name x,y,z f,v - создает энтити с данным именем (враги и декорации) или ключевым словом (Key1, Key2, Key3, Hp1, Hp2, Hp3, Hp4). x,y,z - аналогично частицам, f - скорость, с которой энтити будет двигаться вперед при создании, v - вертикальная скорость при создании. (только враги и декорации).
Следите за пробелами и запятыми, это важно для того, чтобы движок верно распознал параметры. Все ключевые слова и названия состояний РЕГИСТРОЗАВИСИМЫ. Все следует писать латинницей.