воскресенье, 23 июня 2019 г.

Как сделать бонусы в GameMaker Studio?

Сегодня в блоге Econ Dude мы кратко и быстро пробежимся по тому, как в вашей игре можно сделать бонусы, если вы работайте в Гейм Мейкер Студио 1 (GameMaker Studio). Во втором ГМ всё в принципе почти так-же.

Что такое вообще бонус и какие они бывают?

Это объект, который берёт герой, и потом он даёт герою какие-то плюсы.

Бонусы - это очень простая вещь и сделать её может каждый довольно быстро.

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

Давайте начнём с простого.

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

Как сделать бонусы в GameMaker Studio / Econ Dude

Какая-то очередная моя недоделанная TDS

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

Быстренько рисуем новый спрайт бонуса, я думаю это вы умеете делать.

Создаём новый объект: obj_bonus

Перед этим нам нужно продумать логику появления бонуса.

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


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

Пишем в Step у героя вот такое:

if instance_number(obj_bonus)=0
if random(100)>99{
instance_create(random(800),random(600),obj_bonus)
}

Тут я вначале поставил условие, что бонус будет появляться, только если таких бонусов 0 на карте. То есть может валяться только 1.

Далее просто рандом. Шанс выпадения 1 из 100 каждые 1/30 секунды, довольно быстро на самом деле и он будет лежать на карте часто.

И далее функция создания объекта.

Так-же обратите внимание что координаты тут 800 и 600 и рандом.

То есть по Х бонус будет от 0 до 800, а по У он будет от 0 до 600.

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

Можете вот это еще почитать про виды и мини-карту:


Хорошо, герой у нас теперь спамит 1 бонус в случайной точке.

Теперь нам нужно его брать героем.


Тоже картинка кликабельна

Пишем в бонусе при контакте (коллизии) с героем:

global.hero_speed_mod=2
alarm[10]=30*30

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

Тут у нас две вещи и еще крайне важно:

В коде делайте это для героя, а не для бонуса! Ставьте там сверху не self, а other (другой, то есть герой). Так-как мы задумали бонус, который будет работать 30 секунд, то мы не можем вести этот отчёт в бонусе, ибо мы его сразу уничтожим при столкновении с героем. Я для простоты просто кидаю туда еще через конструктор корзину с функцией destroy_instance() и ставлю там на себя.


Так у нас уничтожение срабатывает на себя, на бонус.

А всё остальное срабатывает на другого, на героя.

Что там было у нас в коде выше?

Мы переключаем переменную global.hero_speed_mod=2

Это я сделал просто в виде множителя, то есть когда мы бонус взяли, у нас множитель скорости будет 2х, герой будет в 2 раза быстрее.

Вторая штука там это alarm[10] = 30*30


Тут я написал для простоты понимания 30 умножить на 30 (900), вы могли бы сразу написать 900, просто так понятнее что каждые 30 тиков (FPS) в скорости комнаты - это одна секунда, а таких у нас будет 30 секунд.

Далее, нужно не забыть добавить эту переменную скорости герою изначально. Пишем у героя в create что мол global.hero_speed_mod=1


Не забываем установить базовое значение переменной как 1

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

Далее у нас там есть управление героем на A, D, S и W.

Вот в каждой нужно прописать еще и этот модификатор, множитель.


Пример для движения влево на A

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

x-=3*global.hero_speed_mod

Как не трудно понять теперь, когда мы берём бонус, у нас скорость будет не 3, а 6, так-как там множитель 2. Вроде всё круто.

Можете уже протестировать и запустить.

Я такие вещи без запусков пишу, иногда часами просто код без запусков :)

Что мы еще забыли-то?

Мы забыли выключать этот бонус через 30 секунд.

Мы запустили герою таймер 10 (alarm[10]) при взятии бонуса.

Добавляем:


Откатываем скорость к базовому значению

Пишем там:

global.hero_speed_mod=1

Возвращая множитель и модификатор к норме, к 1 (100% скорости).

Усё друзья. Бонусы создаются, мы их берём, это нас ускоряет, потом бонус спадает. Тут просто надо будет еще сбалансировать всё так, чтобы вы не могли ускоренные бегать бесконечно и бонусы подбирать. Поэтому можете снизить шанс его выпадения, например поставить не random(100)>99, а random(100)>99.9 к примеру.

Это надо будет уже тестировать.

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

Что еще может быть?

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

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

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

Бонусы вам нужны для кучи жанров и игр, я их делал в Space Rush и еще много где. Принципы везде очень похожи.

Недавно я вот делал для прикола еще одну TD:


Игру как всегда не доделал и даже не выкладывал

И вот там я тоже бонусы запилил.

Сделал что они появляются из 4-х точек, специальных спавнеров для бонусов, а бонус даёт +5% к параметрам башни (скорострельность, дальность, ХП и т.д.).

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

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

Последняя вещь, которая вам может пригодиться.

Я почти всегда делаю еще и КД на то, что бонус пропадёт, если герой его не успеет взять. Тут всё очень легко через alarm с момента появления бонуса, можно в нашем примере поставить каждые 3 минуты например. Так веселее будет (бежали к бонусы и он пропал), а так-же может быть ситуация, когда бонус появится непонятно где и герой до него даже не может дойти, поэтому нужно его будет еще раз заспавнить. Именно поэтому делать как я сделал в примере, мол туда рандомные Х и У от размера карты - там делать не нужно. Лучше сделать некие спавнеры бонусов и поставить их так, чтобы они не могли появляться на непроходимых местах или например под деревом.

Вот так. Надеюсь моя статья вам помогла.

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