Найти в Дзене

Улучшаем арканоид на Game Maker Studio

Оглавление

В прошлой статье мы с вами за пол часа сделали арканоид на Game Maker Studio. Если по каким-то причинам упустили, то прошу предварительно ознакомиться с данной статьей:

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

Создаем GUI

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

GUI - это graphical user interface, т.е. графический интерфейс пользователя. Т.е. это то место на экране, где отображаются жизни, уровень здоровья, магии, кол-во патронов и т.д. (в общем вся необходимая для игрока информация).

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

Добавляем новый слой с именем "GUI_layer"
Добавляем новый слой с именем "GUI_layer"

Так же, не выходя из редактора комнат, зайдите в событие создание комнаты Creation Code и пропишите в ней следующий код:

Добавляем код, создающий объект "obj_GUI" при старте уровня
Добавляем код, создающий объект "obj_GUI" при старте уровня

Этим кодом на новом слое мы создаем объект "obj_GUI", который и будет отрисовывать кол-во жизней на экране. Этот объект мы еще не добавляли в игру, по этому давайте создадим его. В нем будет всего одно событие Draw GUI:

Код объекта "obj_GUI"
Код объекта "obj_GUI"

Все, теперь кол-во жизней у нас отображается на экране. Запустите и убедитесь сами!

Слева сверху на экране у нас показано кол-во жизней в виде мячей
Слева сверху на экране у нас показано кол-во жизней в виде мячей

Уничтожаем блоки красиво

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

Немного подредактируем объект блока. В событии создания добавляем одну переменную:

В событии создания блока Create вводим переменную die, которая будет отвечать за смерть блока
В событии создания блока Create вводим переменную die, которая будет отвечать за смерть блока

В событии шага же прописываем следующий код:

Добавляем код события шага (Step) для блока
Добавляем код события шага (Step) для блока

Далее, думаю вы уже догадались, что теперь нам в момент столкновения мяча с блоком нужно не удалять блок, а просто переключить его переменную die с состояния false (ложь) на true (истина).

Заходим в редактор объекта мяча, находим событие столкновения его с блоком и чуть меняем код на следующий:

Редактируем событие collision с объектом obj_block у объекта obj_ball
Редактируем событие collision с объектом obj_block у объекта obj_ball

Запустите и проверьте, что поменялось!

Добавим бите немного "прыгучести"

У каждого объекта в мире на любое действие есть противодействие. Неплохо было бы, если бы и наша бита как-то реагировала на удар мяча об нее. Так давайте сделаем!

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

Вводим переменную yy в событии Create биты
Вводим переменную yy в событии Create биты

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

Добавляем код возврата биты в исходное положение
Добавляем код возврата биты в исходное положение

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

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

Редактируем событие collision с объектом obj_paddle у объекта obj_ball
Редактируем событие collision с объектом obj_paddle у объекта obj_ball

Запускайте игру и наслаждайтесь этой пружинистой битой!

Делаем переход на следующий уровень

Давайте еще добавим условие, чтобы при уничтожении всех блоков у нас осуществлялся переход на следующий уровень. Ради этого дела думаю не будем создавать новый объект, а просто пропишем код в объекте obj_GUI:

Добавим проверку и переход на следующий уровень в коде события шага (Step) объекта obj_GUI
Добавим проверку и переход на следующий уровень в коде события шага (Step) объекта obj_GUI

Теперь сделайте несколько уровней и наслаждайтесь игрой!

Скриншот одного из моих уровней
Скриншот одного из моих уровней

Спасибо, что дочитали статью до конца! Ставьте лайки, делитесь ей с другими, задавайте вопросы, оставляйте комментарии, пожелания и т.д. Далее игру еще есть куда улучшать! Можно добавить бонусы, выпадающие из разбитых блоков, которые будут расширять биту, добавлять пулемет на биту и пр. Можно добавить несколько типов блоков, которые ведут себя по разному. Например, блоки, которые нельзя разбить или блоки, которые разбиваются с нескольких раз и т.д. Можно еще добавить музыку и звуки в игру (я как-то забыл об этом написать).

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