Предисловие
Гильза — это обычный Projectile (снаряд) который имеет гравитацию, и может отскакивать от пола. Мы будем создавать гильзу в 2 этапа:
- Создадим гильзу.
- Создадим снаряд который пролетает небольшое расстояние, а затем «умирает» спавня за собой гильзу.
2ой этап нужен чтобы гильза спавнилась на некотором расстоянии от игрока.
Ладно, приступим к созданию.
1. Создание гильзы.
Перед началом скачайте спрайты гильзы с MEGA.
Напишите следующий код к себе в DECORATE:
actor GunSleeve {
Scale 0.1
Speed 6
radius 3
height 3
Projectile
+DoomBounce
-NoBlockMap
-NoGravity
states
{
Spawn:
SLEE ABCDEFGH 3
loop
Death:
SLEE CCCCCCCCCCCC 35
stop
}
}
- Scale — задает масштаб актора (гильзы). В данном случае, гильза уменьшена в 10 раз.
- Speed — задает изначальную скорость гильзы, потом, разумеется, скорость гильзы упадет под действием гравитации -NoGravity.
- +DoomBounce — флаг включающий отталкивание, скорость при таком отталкивании снижается.
- —NoGravity — задает включение гравитации
Наша гильза это актор (снаряд), который в стейте Spawn проигрывает анимацию кручения:
Актор имеет гравитацию (-NoGravity), поэтому он падает и отталкивается от земли (+DoomBounce). Когда он потеряет скорость, он перейдет на стейт «Death«, в котором застынет на картинке SLEEC0. И, через некоторое время, исчезнет.
Теперь перейдем ко второму этапу.
Создание спавнера гильзы.
Добавьте следующий код, к себе в DECORATE:
actor GunSleeveSpawner {
Speed 20
Projectile
radius 1
height 1
states
{
spawn:
TNT1 A 1
Goto Death
Death:
TNT1 A 0 A_CustomMissile("GunSleeve",-5,5,random(-80,-100),2,random(40,60))
stop
}
}
В нашем спавнере, снаряд живет 1 тик (TNT1 A 1), и затем умирает, оставляя за собой потомство. Регулировать расстояние спавнера от игрока, можно в атрибуте Speed.
Кстати, TNT1 это спрайт встроенный в zdoom, он обозначает пустой спрайт. Таким образом, наш спавнер становится — невидимым.
Остановимся на комманде A_CustomMissile, синтаксис у неё следующий:
A_CustomMissile("название_снаряда", высота_спавна_снаряда, смещение_x, yaw, флаг, pitch)
- название_снаряда — задает название снаряда
- высота_спавна_снаряда — задает относительную высоту спавна, если 0 то снаряд спавнится в том месте, где умер GunSleeveSpawner.
- смещение_x — задает смещение по оси x, если «-5» то смещение влево, если «5» то вправо.
- yaw— значение от 0 до 360, указывающий угол полета.
- флаг — задает то, относительно чего рассчитываются углы.
- pitch — задает вертикальный угол.
yaw/pitch/roll— в 3D пространстве — 3 угла. Когда мы смотрим влево/вправо, мы меняем yaw. В тот момент, когда мы смотрим вверх/вниз, мы меняем pitch. А когда наклоняем голову, мы меняем roll.
Для простоты, представьте что стрелка идущая вверх, это ты.
В нашем случае:
TNT1 A 0 A_CustomMissile("GunSleeve",-5,5,random(-80,-100),2,random(40,60))
- название_снаряда — «GunSleeve», наша гильза
- высота_спавна_снаряда — «-5», это значит что снаряд спавнится ниже, того места куда ты смотришь.
- смещение_x — «5», снаряд спавнится на растоянии 5 пикселей вправо.
- yaw— random(-80,-100), мы задаем случайный угол, от -80 до -100.
- флаг — 2
- pitch — random(40,60)
Спавнер создан, теперь осталось привязать его к нашему оружию. В качестве оружия, я буду использовать coolGun, из урока DECORATE. Делаем оружие.
Привязываем спавнер, к оружию.
Я переписал стейт Fire, теперь он выглядит так.
Fire:
NULL A 0 A_FireCustomMissile("GunSleeveSpawner",0,0,0)
CWEP B 1 A_FireCustomMissile("blueProj")
CWEP C 1
CWEP DE 5 A_ReFire
Goto Ready
Теперь, вместе со снарядом, будет вылетать гильза.