Блог ☯

суббота, 25 марта 2017 г.

Основы создания игр: стрельба, как сделать выстрел и пули в Game Maker Studio 2

Продолжаем серию уроков - основы создания игр в game maker. Сегодня рассмотрим как сделать простейшую механику выстрела - как сделать выстрел.

Постепенно перехожу на Game Maker Studio 2, поэтому будем делать там, хотя разница минимальна.

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

Как всё это сделано например в игре crimsonland, если бы её делали в GMS2?

Основы создания игр: стрельба, как сделать выстрел, стрельбу и пули в game maker Studio 2

По сути нам нужна комната и 3 объекта - герой, пуля и враг. Ну и спрайты к ним.

Основы создания игр: стрельба, как сделать выстрел, стрельбу и пули в game maker Studio 2

Вот примерно так. В видео я подробно говорю как это всё сделать в гейм мейкер студио 2, хотя если вы читали или смотрели другие мои уроки, вы должны эти вещи знать.

Создаём пулю:

Основы создания игр: стрельба, как сделать выстрел, стрельбу и пули в game maker Studio 2

При нажатии на левую кнопку мышки (глобально).

Вообще, нам достаточно вот этого:
instance_create_depth(x,y,0,obj_bullet)
Остальное это уже блок (чтобы не создавалось много пуль сразу), а нижние 2 alarm, это просто я делал очередь. Тоже пока не нужно.

Далее, пуля должна лететь куда-то, да? Об этом я уже писал вот тут:
Основы создания игр: стрельба, как сделать выстрел, стрельбу и пули в game maker Studio 2

Код движения к курсору мышки при создании пули:
move_towards_point(mouse_x,mouse_y,50)
-50+random(100) это разброс при стрельбе, если он вам нужен, можете сделать вот так.

50 - это скорость полёта пули. Довольно быстро, обычно я делаю около 15-30, в зависимости от типа оружия и игры (тут еще зависит от FPS).

Как сделать чтобы враг умирал при касании пули? Если совсем просто:

Основы создания игр: стрельба, как сделать выстрел, стрельбу и пули в game maker Studio 2

Тут умирает и враг, и пуля. Пулю тоже не забываем убивать, иначе она будет пролетать через врагов и мочить всех (что тоже иногда надо, но тогда урон посчитается много раз, учитывайте это, если есть система ХП и урона).
instance_destroy(self)
instance_destroy(other)
Да вот и всё на самом деле! Вот так и делается стрельба.

  • Герой создаёт пулю при нажатии на мышку (или куда хотите)
  • Пуля летит туда, где находится мышка (или куда хотите)
  • Пуля убивает врага, или наносит ему урон. 
Как сделать урон и систему ХП? Немного другая тема, но если делать просто: 

В создании врага: hp=100

Можно например еще: armor = 5

При коллизии (столкновении) пули и врага: 
other.hp-=self.damage-other.armor
Один из способов. При этом нам надо в пуле, при создании, прописать её урон (damage). Можно это сделать глобальной переменной (global.damage) и задавать урон в зависимости от навыков, дистанции полёта, оружия и чего угодно. 

Смотрите исходник Lonely Dude, там даже урон в зависимости от дистанции меняется. 

Сделаем урон например 10, а броня 5, то будет наноситься урон 5. 

Как убивать? Там-же, при коллизии пули и врага пишем: 
instance_destroy(self) // пулю тоже не забываем убиватьother.hp-=self.damage-other.armor
if other.hp<=0 then instance_destroy(other)
Вот, хотя это и немного другая тема. 

Как сделать чтобы пуля тупо летела например наверх? 

При создании пули пишем vspeed-=10 (Или другое число / переменную) 

Либо же в шаге (step) пишем y-=10 

Как сделать чтобы вылетало сразу несколько пуль? 

При создании пули (в герое), пишем: 
repeat(5) instance_create_depth(x,y,0,obj_bullet)
repeat - повторим 5 раз (или сколько вам надо). Нужно например для дробовика. 

Как сделать разлёт пуль? 

Можно просто при создании прописать у пули: 
vspeed=-1+random(2)
hspeed=-1+random(2)
Тогда мы дополнительно сообщим пуле скорость, но это кривоватый метод. 

Лучше при определении направления полёта, писать: 
move_towards_point(mouse_x-50+random(100),mouse_y-50+random(100),50)
Тут от центра мышки будет разлёт в квадрате 50 на 50. Можно разлёт сделать переменной. 

Как сделать очередь? 

Либо делаем патроны (ammo) переменной (глобальной или локальной), а потом просто проверяем их наличие. Тогда при создании пули, пишем: 


if ammo>0{
instance_create_depth(x,y,0,obj_bullet)
ammo-=1
}

Если у нас 10 пуль (пишем в create: ammo = 10, у героя), тогда он быстро выпустит 10 пуль и всё. Дальше уже нужно будет делать перезарядку. Смотрите исходник Lonely Dude, там всё это есть. 

Так-же очередь можно сделать другим способом, про него я говорю в видео: