Article
OO
Oliver Orangers
02/12/25
Урок 05. Стрельба

Привет, друг!

Мы продолжаем наш цикл разработки своей игры в жанре рогалик в Gamemaker!

Сегодня мы займемся стрельбой нашего игрока.


Для начала зайдем в событие шаг в oPlayer.

Добавим новые клавиши для стрельбы!

Назовем их keyShootLeft, keyShootRight, keyShootUp и keyShootDown.

Код выглядит так:


keyShootLeft = keyboard_check(vk_left);

keyShootRight = keyboard_check(vk_right);

keyShootUp = keyboard_check(vk_up);

keyShootDown = keyboard_check(vk_down);



Теперь, когда у нас есть переменные, которые отвечают за клавиши, мы можем подумать, что должно меняться при нажатии на них. Конечно, надо чтобы вылетала какая-то пулька. Давайте ее нарисуем и создадим для нее отдельный объект.

У меня спрайт пульки будет анимированный, 12 на 12 пикселей, но вы можете выбрать любой размер, как и анимацию, если она вообще у вас будет! Я назову свой спрайт пули sBullet


В объекте пули, который я назвал oBullet мы добавим событие “Создать”. И скажем, какая скорость будет у нашей пульки. Для этого можем использовать уже встроенную переменную “speed”. Скажем, что она равна значению. Пусть у меня будет около 2.


Подумаем, что мы хотим. Мы хотим, чтобы игрок, нажимая на клавиши атаки создавал объект пули, пусть на отдельном слое, для удобства. И эта пулька брала и меняла своё направление в зависимость от нажатой кнопки атаки. Таким образом, мы сможем идти куда угодно и при этом стрелять куда угодно.


Давайте дальше писать в “Шаге” oPlayer. Я продолжу писать мой код до блока с “Движением”, сразу после кнопок стрельбы.

Напишем, что если кнопка “keyShootLeft” нажата, то создается новый объект на слое “Bullets”, которого пока у нас нет в комнате! Затем, вместе с этим созданием пульке присвается direction(направление) 180.

Благодаря конструкции “with” можно писать переменные уже для того, с чем он связан. То есть изменится направление не игрока, а созданной пули. Удобно!


Как понять, какое направление? Почему 180? Очень просто!


Направление в gamemaker начинается справа. Так что направо будет 0 градусов, а затем как в геометрии! 1 четверть окружности это 90 градусов. Так что выходит, что наверх это 90 градусов, налево уже 180(90+90), а вниз 270.

Продублируем с помощью “CTRL + D” строчки и поменяем названия переменных и значения направления (direction).


Получается так:


if (keyShootLeft)

{

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 180;

}

}

if (keyShootRight)

{

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 0;

}

}

if (keyShootUp)

{

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 90;

}

}

if (keyShootDown)

{

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 270;

}

}


Должно быть, ты заметил, что я поставил везде y-5? Это для того, чтобы пулька появлялась не в точке основания, которая у нас, должно быть под ногами, а чуть выше. На 5 пикселей. Так пулька у меня будет вылетать из тела.


Первая часть готова, проверим?

Не забудем создать слой Bullets, на котором будут появляться наши пули, иначе появится ошибка!

Создаем слой Instances и переименовываем его также, как и в коде - “Bullets”.


У нас сейчас две проблемы появятся, если мы протестируем.

Первое:

Игрок можем зажать кнопку стрельбы и пули будут создаваться каждый кадр, так как наш код находится в событии шаг. Надо ограничить это, создав переменную “скорострельность”.

Второе:

Игрок может зажать больше 1 кнопки и тогда герой будет выстреливать сразу в эти стороны, таким образом, ломая баланс.


Давайте решим первую проблему.

Добавим новые переменные в “Создать” Игрока.

shootCooldown = 0; - это сколько кадров до возможности стрелять

shootTimer = 24; это скорострельность. 1 выстрел в 24 кадра.


После выстрела наш shootCooldown будет увеличиваться до shootTimer(на 24 в нашем случае). После чего мы не можем стрелять, пока shootCooldown не равен опять 0. Он уменьшается на 1 каждый кадр. И через 24 кадра мы опять можем стрелять!

Надо это запрограммировать в шаге игрока. Перейдем в это событие и запишем перед всем блоком, что если shootCooldown меньше 0, то он уменьшается.

Затем, внимание, В КАЖДОМ БЛОКЕ с нажатием напишем, что после того, как мы выстрелили, shootCooldoown сбрасывается до shootTimer. При этом, надо не забыть добавить еще и проверку при нажатии на кнопку. Мы можем стрелять не только когда нажимаем на кнопку, но и shootCooldoown должен быть равен или меньше 0.



Весь код стрельбы выглядит так:

//Блок стрельбы

if (shootCooldown > 0) shootCooldown--;

if (keyShootLeft) and (shootCooldown <= 0)

{

shootCooldown = shootTimer;

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 180;

}

}

if (keyShootRight) and (shootCooldown <= 0)

{

shootCooldown = shootTimer;

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 0;

}

}

if (keyShootUp) and (shootCooldown <= 0)

{

shootCooldown = shootTimer;

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 90;

}

}

if (keyShootDown) and (shootCooldown <= 0)

{

shootCooldown = shootTimer;

with(instance_create_layer(x,y-5,"Bullets",oBullet))

{

direction = 270;

}

}


Интересно то, что сделав ограничение мы решаем еще и вторую проблему. Теперь как только вылетает одна пулька, то она блокирует вылет других.

Круто!

По мелочам, можем добавить пульте глубину, которая зависит от того, где находится хитбокс пульки. Для этого в шаге игрока и пули(да и вообще, где захотим) напишем: depth = -bbox_bottom;

Выходит, что мы можем добавить врагов? Именно. Домашнее задание! Сделайте спрайты врагов, а на следующем занятии мы с вами сделаем так, чтобы они появлялись, следовали за игроком и умирали от пули.

Ссылка на следующую статью: Урок 06. Враги - https://cr5.space/h/ru-gamemaker/post/7

Peace!

Comments