вторник, 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, где я иногда отвечаю, либо отвечают другие подписчики паблика. Там можете задавать конкретные практичные вопросы, хотя никогда не гарантирую, что отвечу, но помогаю по возможности.