Продолжаю рассказывать в блоге Econ Dude про базовые функции GameMaker. Сегодня вы узнаете как удалить объект в GameMaker Studio и про удаление (уничтожение) объектов вообще. Тема базовая и очень простая, но для новичков она важна.
При удалении объекта важно указывать, к кому применяется удаление.
Недавно я как раз писал как создавать объекты в GM, теперь про удаление.
Удалить объект можно с помощью конструктора, а так-же с помощью кода.
Удаляем объект - врага (o_mob_1) при столкновении пули с ним (коллизия)
Это самый простой пример механики удаления объекта, когда пуля касается врага. При этом часто вам нужно удалить еще и саму пулю, иначе она пролетит через врага и нанесёт еще урон несколько раз. Иногда вам именно это и нужно сделать, но тут уже детали.
Если интересно, можете глянуть это видео:
При удалении объекта важно указывать, к кому применяется удаление.
- Self - к себе, к тому, кто выполняет функцию;
- Other - к другому, к тому, с кем идёт взаимодействие;
- Object - к другому постороннему объекту.
На картинке выше объект "пуля" сталкивается с объектом "враг" (event - событие коллизии). Следовательно удаления для себя (self) означает удаление пули, удаление для другого будет означать удаление врага.
Бывают случаи, когда вам нужно вызвать удаление какого-то объекта, или всех таких объектов, в один момент. Допустим вам нужно стереть с карты все деревья.
Вот тогда вы укажете там other - obj_tree (дерево), и удаляться все деревья вообще.
Я лично это использую не очень часто, но иногда это тоже нужно.
Аналогично и в коде, давайте посмотрим как удалять объекты через код.
Картинки в этой статье кликабельны, нажмите для увеличения
Удаляем пулю (себя) при столкновении с врагом
Удаляем пулю (себя) при столкновении с врагом
Код и синтаксис очень простой:
instance_destroy()
Удаление инстанции и скобочки. Тут мы тоже указываем для кого это применяется (self, other, object), короче всё так-же как и в случае с drug and drop (конструктор).
Удаление и стирание объектов это такая-же важная функция, как и их создание, она вам будет нужна часто и почти в любой игре.
В большинстве случаев удаление будет всяких пуль и врагов.
Хотя это не совсем часть этой статьи, но как сделать например уничтожение врага не с первой пули, с нескольких попаданий?
- Читайте так-же: Как сделать стрельбу, выстрел и пули?
В этом случае вам нужна локальная переменная жизней у врага (hp), а при контакте пули с врагом (пули врага с героем аналогично) будет как-то так:
hp-=1 // наносим урон, вычитаем жизни;
if hp<=0 then instance_destroy() // убиваем если жизней меньше нуля;
При этом если мы говорим про контакт пули героя с врагом, то в пуле это всё прописывается в категории other, ибо HP - это локальная переменная именно врага.
Бывают и приколы, к примеру тот-же случай, но нам надо еще например удалять пулю. Тогда мы вставляем еще один кусок кода, и там уже удаляем self.
Другой случай, который я иногда использую, это постоянная проверка на удаление.
Случайный пример от балды - проверка дальности полёта пули
В этом случае, уже в step (выполняется каждый тик, при FPS = 30 проверка 30 раз в секунду) мы проверяем, если расстояние пули до героя больше 300 пикселей, тогда мы удаляем пулю. Это один из способов сделать дальность стрельбы. Кривой способ.
Хотя есть и более извращённые способы это делать, например при создании пули запускать alarm, и удалять пулю через Х секунд полёта.
Подобная проверка на удаление может быть полезна и в случае жизней. Допустим вы можете постоянно проверять, если у героя или врага меньше жизней чем 0, и тогда удалять его. Но тоже самое можно проверять только 1 раз, в момент урона.
Вообще, способов применять удаление объектов миллионы.
Например можно делать так эффекты, но я не рекомендую.
Допустим при повреждениях вы создаёте кровь (объект), а потом пишите в step:
image_alpha-=0.05;
if image_alpha=0 then instance_destroy();
Тут прозрачность постепенно снижается (повышается?), а когда она достигает нуля, то объект как-бы испаряется - удаляется. Это не так уж и плохо выглядит.
Гляньте видео (1 минута), я так делал элементы меню:
Как вначале кнопки медленно появляются из нулевой прозрачности, так можно сделать и обратный эффект, что они медленно исчезают.
Даже и не знаю, что еще сказать про удаление объектов в Гейм Мейкер, разве что хочу поведать вам одну фишку про удаление объектов из комнаты.
Допустим вы понаставили в комнату кучу объектов, штук 50 - 100 и больше.
Вам нужно их быстро удалить: Можно жать на каждый и выбирать:
А можно зажать Shift и правую кнопку мышки, и тогда вы сможете быстро удалять кучу объектов просто водя по ним мышкой. Не все знают про это.
Может быть удобно при очистке сетки и т.п.
Последнее, что скажу, не забывайте удалять объекты, когда они уходят из комнаты. Они не удаляются по умолчанию. Удаление прописывается в событии Outside Room (снаружи комнаты), это в других событиях (The Other Event).
Если вы не будете удалять к примеру пули, которые не попадают во врагов и улетают за карту, то они там за картой так и продолжают лететь, сжирая ресурсы игры.
Вот в целом и всё, что я хотел сказать про удаление объектов в ГМС.
Другие материалы про создание игр в GMS вы найдёте тут:
Даже и не знаю, что еще сказать про удаление объектов в Гейм Мейкер, разве что хочу поведать вам одну фишку про удаление объектов из комнаты.
Допустим вы понаставили в комнату кучу объектов, штук 50 - 100 и больше.
Как сразу и быстро удалить кучу объектов?
Вам нужно их быстро удалить: Можно жать на каждый и выбирать:
Удалить всё под курсором или только верхний объект
А можно зажать Shift и правую кнопку мышки, и тогда вы сможете быстро удалять кучу объектов просто водя по ним мышкой. Не все знают про это.
Может быть удобно при очистке сетки и т.п.
К примеру если вам нужно удалить всё это добро из комнаты
Скрин из моей игры - City Rush (видео / статья про игру)
Скрин из моей игры - City Rush (видео / статья про игру)
Последнее, что скажу, не забывайте удалять объекты, когда они уходят из комнаты. Они не удаляются по умолчанию. Удаление прописывается в событии Outside Room (снаружи комнаты), это в других событиях (The Other Event).
Если вы не будете удалять к примеру пули, которые не попадают во врагов и улетают за карту, то они там за картой так и продолжают лететь, сжирая ресурсы игры.
Вот в целом и всё, что я хотел сказать про удаление объектов в ГМС.
Какие-то вопросы - задавайте в комментах.
Надеюсь статья вам помогла.
Другие материалы про создание игр в GMS вы найдёте тут: