четверг, 11 января 2018 г.

Как удалить объект в GameMaker?

Продолжаю рассказывать в блоге Econ Dude про базовые функции GameMaker. Сегодня вы узнаете как удалить объект в GameMaker Studio и про удаление (уничтожение) объектов вообще. Тема базовая и очень простая, но для новичков она важна.

Недавно я как раз писал как создавать объекты в GM, теперь про удаление.

Удалить объект можно с помощью конструктора, а так-же с помощью кода.

Как удалить объект в GameMaker?

Удаляем объект - врага (o_mob_1) при столкновении пули с ним (коллизия)

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

Если интересно, можете глянуть это видео:



При удалении объекта важно указывать, к кому применяется удаление.

  • Self - к себе, к тому, кто выполняет функцию;
  • Other - к другому, к тому, с кем идёт взаимодействие;
  • Object - к другому постороннему объекту.

На картинке выше объект "пуля" сталкивается с объектом "враг" (event - событие коллизии). Следовательно удаления для себя (self) означает удаление пули, удаление для другого будет означать удаление врага. 

Что такое удаление постороннего объекта (object) и зачем это нужно?

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

Вот тогда вы укажете там other - obj_tree (дерево), и удаляться все деревья вообще.

Я лично это использую не очень часто, но иногда это тоже нужно.

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

Как удалить объект в GameMaker?

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

Код и синтаксис очень простой:

instance_destroy()

Удаление инстанции и скобочки. Тут мы тоже указываем для кого это применяется (self, other, object), короче всё так-же как и в случае с drug and drop (конструктор).

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

В большинстве случаев удаление будет всяких пуль и врагов.

Хотя это не совсем часть этой статьи, но как сделать например уничтожение врага не с первой пули, с нескольких попаданий?


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

hp-=1 // наносим урон, вычитаем жизни;
if hp<=0 then instance_destroy() // убиваем если жизней меньше нуля;

При этом если мы говорим про контакт пули героя с врагом, то в пуле это всё прописывается в категории other, ибо HP - это локальная переменная именно врага.

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

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

Как удалить объект в GameMaker?

Случайный пример от балды - проверка дальности полёта пули

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

Хотя есть и более извращённые способы это делать, например при создании пули запускать alarm, и удалять пулю через Х секунд полёта.

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

Вообще, способов применять удаление объектов миллионы.

Например можно делать так эффекты, но я не рекомендую.

Допустим при повреждениях вы создаёте кровь (объект), а потом пишите в step:

image_alpha-=0.05;
if image_alpha=0 then instance_destroy();

Тут прозрачность постепенно снижается (повышается?), а когда она достигает нуля, то объект как-бы испаряется - удаляется. Это не так уж и плохо выглядит.

Гляньте видео (1 минута), я так делал элементы меню:


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

Даже и не знаю, что еще сказать про удаление объектов в Гейм Мейкер, разве что хочу поведать вам одну фишку про удаление объектов из комнаты.

Допустим вы понаставили в комнату кучу объектов, штук 50 - 100 и больше.

Как удалить объект в GameMaker?

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

Вам нужно их быстро удалить: Можно жать на каждый и выбирать:

Как удалить объект в GameMaker?

Удалить всё под курсором или только верхний объект

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

Может быть удобно при очистке сетки и т.п.

Как удалить объект в GameMaker?

К примеру если вам нужно удалить всё это добро из комнаты
Скрин из моей игры - City Rush (видео / статья про игру)

Последнее, что скажу, не забывайте удалять объекты, когда они уходят из комнаты. Они не удаляются по умолчанию. Удаление прописывается в событии Outside Room (снаружи комнаты), это в других событиях (The Other Event).

Как удалить объект в GameMaker?

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

Вот в целом и всё, что я хотел сказать про удаление объектов в ГМС.

Какие-то вопросы - задавайте в комментах. 
Надеюсь статья вам помогла.

Другие материалы про создание игр в GMS вы найдёте тут: