Страницы

вторник, 2 мая 2017 г.

Удар в ближнем бою в GameMaker

Приветствую. Сегодня рассмотрим базовую механику при создании игр - удар в ближнем бою. Как это сделать в гейм мейкер студио (GameMaker Studio), как это вообще работает и какие есть способы сделать ближний бой для игры любого жанра, от RPG до платформера. Это пока идут всё еще основы создания игр, хотя более сложные темы я тоже иногда касаюсь как в блоге Econ Dude, так и на своём ютуб канале.

Основы создания игр - удар в ближнем бою. GameMaker

Классический пример механики ближнего боя, область удара


Для статьи и видео (чуть позже) я использовал некоторые материалы Shaun Spalding. Его канал один из лучших по GMS, он полезен вам по любой теме создания игр, но канал на английском. Я его смотрю если тема сложная и иногда перевожу, но чаще мне удобнее написать систему и движок с нуля и как считаю нужным.

Итак, как делается удар в ближнем бою, будь то меч, булава, лазерная сабля или что угодно, у чего дальность атаки либо 0 (коллизия), либо чуть дальше (копьё, длиный меч и т.п.). Кстати, даже если вы не будете делать ближний бой герою, то врагов с ближним боем вам придётся делать довольно часто, ибо это один из их основных типов.


По сути дела удар в ближнем бою не сильно отличается от механики стрельбы, вся разница в том, что при стрельбе урон проходит на дальней дистанции, а ближний бой, понятное дело, работает только вблизи. Если вы не знаете, как сделать стрельбу, можете посмотреть вот эту статью и там-же видео:


Однако одну тему я так и не покрыл, хотя она тоже простая - это области поражения и splash (урон по области). Это есть например в моей игре Space Rush, Там при уничтожении пули, наносится дополнительный урон в области поражения.

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

Замечу, что я предложу вам всего несколько способов сделать удар в ближнем бою, есть и другие и тут многое зависит от вашего типа игры и того, как вы хотите чтобы работала данная механика. По сути основных способа сделать механику три:

  • Область поражения;
  • Постоянный урон каждый тик;
  • Коллизия.

Ладно, как-же сделать сражение в ближнем бою в своей игры, если мы делаем игру с нуля? Простая логика и простой код.

Интересный пример - это взять исходник моей игры Lonely Dude и посмотреть там на то, как сделан огнемёт. По сути дела удар в ближнем бою можно сделать просто как выстрел на сверх близкую дистанцию, с технической точки зрения.

Огнемёт в этом смысле работает похожим образом. Как создавать пули вы уже должны знать и как сделать чтобы они летели в направление которое вам нужно (например к курсору мышки), ну вот так-же можно сделать и удар в ближнем бою.

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

Так-же тут нам нужна будет особая анимация, но этот момент я не особо покрывал, хотя в том-же Lonely Dude есть вариант реализации анимации удара и стрельбы.

Как и есть видео про анимацию на моём канале в ютуб - Econ Dude.

Даже два видео:





Лучше посмотрите второе видео, хотя начало первого тоже норм.

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

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


Еще раз посмотрите на эту картинку

Происходят очень простые вещи. При атаке вы создаёте область поражения (тут красная чисто для наглядности, в игре будет невидимая).

Ну и при коллизии (столкновении) этой области с врагами (или ящиками и т.п.) мы наносим им урон по той-же самой логике как это делается для пуль.

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

Тут есть два способа и тут вам как раз я советую почитать вот эту статью:


По той-же логике, что пуля не коцает одного врага больше чем один раз, можно сделать и удар в ближнем бою. Записываем ID врагов в пулю (область поражения - hit box).  Другой способ - это уничтожать данную область поражения через 1 тик, моментально.

Для этого вы можете в events (события) выбрать post draw (после отрисовки) и написать там instance_destroy()

В этом случае область поражения будет соприкасаться с объектами только 1 тик - минимальный отрезок времени и потом сразу уничтожаться.

Правда с этим методом иногда бывают глюки, и я иногда делаю урон 1/5, а длительность 5 тиков, это как пример. Почему-то иногда слишком мало тиков работает странно и не всегда считается так, как нужно.

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


Lonely Dude - ближний бой

На этом всё. Я так и не дела конкретный код, но я объяснил для вам принципы. Код очень простой и он аналогичен тому, как делается выстрел, а про это есть статья, на которую я дал ссылку в самом начале. Другой способ - коллизия, при соприкосновении с героем или врагом. Ну тут всё еще просто, как-то так:


Картинка кликабельна

В данном случае игра - Tower Defense (Random Towers 1.2), в ней в ближнем бою бьют враги ваши башни, когда доходят до них. 

Вот на картинке я показываю удар. Просто отнимает ХП и убиваем башню если жизней меньше либо равно нулю. Тут я для простоты убиваю врага сразу, таким образом каждый враг делает башни только один удар, но чтобы он продолжал бить, нам нужно сделать КД (время для следующей его атаки), а это делается по аналогии со спавнами, просто используем alarm события и некую переменную, коротая блокирует.

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

Можно делать более лениво, к примеру наносить 0.1 урона и без блокировок. Таким образом каждую секунду будет наноситься 0.1 * 30 = 3 урона, если у вас скорость комнаты и FPS = 30. Так я тоже иногда делал ближний бой, но эта механика слишком тупая и вероятно она сильнее грузит систему, так-как всё обсчитывается постоянно.

Вот такие дела. Если есть вопросы, у меня в паблике ВК вы можете найти специальное обсуждение с вопросами по GameMaker, где я иногда отвечаю, либо отвечают другие подписчики паблика. Там можете задавать конкретные практичные вопросы, хотя никогда не гарантирую, что отвечу, но помогаю по возможности.

Вот такие дела.

Другие статьи про создание игр в блоге Econ Dude вы найдёте тут: