Привет, друг!
Мы продолжаем наш цикл разработки своей игры в жанре рогалик в 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!