Предисловие
Наше оружие coolGun из урока DECORATE. Делаем оружие., не ощущается как оружие, оно ощущается как какой-то игрушечный пистолет. Нет, той самой отдачи, которая присуща реальному оружию. В данном уроке, мы исправим эту проблему.
Добавляем вес, нашему оружию.
Замените стейт Fire, на следующий код:
Fire:
CWEP B 2 offset(-1,0) {
A_FireCustomMissile("blueProj");
A_ZoomFactor(0.98);
A_SetPitch(pitch-1.0);
A_Recoil(0.5);
A_FireCustomMissile("GunSleeveSpawner",0,0,0);
}
CWEP C 2 offset(1,0) A_SetPitch(pitch+1.0)
CWEP D 5 A_ReFire
CWEP E 0 A_ZoomFactor(1.0)
CWEP E 5
Goto Ready
Здесь я использовал анонимные функции, они выполняют не одну комманду, а несколько. То-есть вместо того чтобы писать так:
NULL A 0 A_ZoomFactor(0.98)
NULL A 0 A_SetPitch(pitch-1.0)
NULL A 0 A_Recoil(0.5)
NULL A 0 A_FireCustomMissile("GunSleeveSpawner",0,0,0)
CWEP B 2 offset(-1,0) A_FireCustomMissile("blueProj")
Я написал так.
CWEP B 2 offset(-1,0) {
A_FireCustomMissile("blueProj");
A_ZoomFactor(0.98);
A_SetPitch(pitch-1.0);
A_Recoil(0.5);
A_FireCustomMissile("GunSleeveSpawner",0,0,0);
}
Что, в разы удобнее.
А теперь, разберем комманды.
- A_ZoomFactor — задает значение отдаление/приближение камеры игрока (зум), 1.0 — обычное состояние, 0.5 — камера отдалилась, 1.5 — камера приблизилась.
- A_SetPitch — меняет текущий pitch, когда ты крутишь мышкой вверх/вниз — ты меняешь pitch.
- A_Recoil — задает отталкивание игрока (перемещение назад)
В этой строке:
A_SetPitch(pitch-1.0);
Переменная pitch, указывает текущее значение pitch игрока.
Для лучшего понимания, советую ознакомится с уроком DECORATE. Добавляем гильзы., там я подробно объяснял yaw/pitch/roll.
Также можно задать смещение оружия (оружие переместится на несколько пикселей), это делается с помощью offsets. Синтаксис у offsets следующий:
offset(смещение_x,смещение_y)
Думаю, тут и так все понятно.
В нашем случае. Мы задали смещение «-1» по оси x, теперь оружие показывается чуть левее.
CWEP B 2 offset(-1,0) {
Хорошо, с этим закончили:
CWEP B 2 offset(-1,0) {
A_FireCustomMissile("blueProj");
A_ZoomFactor(0.98);
A_SetPitch(pitch-1.0);
A_Recoil(0.5);
A_FireCustomMissile("GunSleeveSpawner",0,0,0);
}
На данный момент, мы рассмотрели все новые комманды, поэтому я не буду объяснять остальной код, а просто объясню логику.
Как работает отдача?
В первом кадре выстрела:

Спрайт оружия смещается влево, на 1 пиксель.
offset(-1,0)
Затем:
- спавнит снаряд
- чуть-чуть отдаляет камеру
- немного поворачивает камеру вверх
- и отталкивает игрока, на небольшое расстояние
Во втором кадре выстрела:

Спрайт оружия смещается вправо:
offset(1,0)
Затем:Вертикальный поворот камеры (pitch), возвращает камеру в изначальное положение (в первом кадре мы прибавили убавили 1, в этом прибавили).
A_SetPitch(pitch+1.0)
После того, как законччили стрелять, зум вернулся в обычное состояние.
Ну, вроде все рассмотрел, если остались вопросы, задавайте их в комментариях.
Итоговый результат.
На гифке, из-за ограничения кадров, не показывается тряска камеры (вверх/вниз).
