Объекты в Game Maker

Добавлен , опубликован

Основные понятия

Объекты - это суть Game Maker. Об объектах можно думать, как о некоторой сущности, которая имеет свои характеристики и по-своему реагирует на события, после чего выполняет предписанные разработчиком игры действия. Главный герой в вашей игре будет объектом, все враги - тоже. Различные препятствия и ловушки в игре - также объекты. Объектами будут снаряды, предметы, бонусы. Всякие менеджеры контроля уровней, отображения интерфейса, даже кнопки главного меню могут быть объектами (а могут и не быть, уж как пожелаете). В общем объекты - это основа нашей игры и её динамическая составляющая.
Создать новый объект можно кликнув кнопку на панели инструментов "Create an Object", или кликнув правой кнопкой по папке Objects в панели ресурсов и выбрав пункт "Create Object". Откроется окошко, элементы которого мы сейчас рассмотрим.
Name: Системное имя объекта, используется при разработке.
Sprite: Здесь вы сможете указать стандартный спрайт для объекта. Если вы не укажите спрайт, вы не сможете увидеть объект в игре. Конечно, это не важно, если вы будете рисовать вместо стандартного спрайта спрайт с помощью функций рисования. А может, вам и не нужно, чтобы объект могли увидеть :Р
Visible: Снятие галочки делает объект невидимым, т.е., он прячет стандартный спрайт, и объект перестаёт реагировать на события рисования. Тем не менее, это не деактивирует объект, он по-прежнему реагирует на события столкновения и выполняет все свои действия.
Solid: Сделать объект твёрдым. Свойство твёрдости нужно для того, чтобы в некоторых случаях по-другому обрабатывались события столкновения. Твёрдыми, к примеру, можно сделать стены и платформы.
Depth: "Глубина" объекта на экране. Чем больше это число - тем ниже остальных объектов будет отображаться. Уменьшение этого числа выносит объект на передний план, т.е. ближе к зрителю. Свойство нужно, чтобы правильно позиционировать объекты относительно перспективы - ближние и дальние объекты. Также, всё, что нарисует объект, будет отображаться на той же глубине (или слое, если вам так проще понимать). Так что объекты, которые рисуют, к примеру, интерфейс, должны иметь большую отрицательную глубину. Я, к примеру, для таких объектов просто ставлю -99999 и забываю об этом. Объекты, которые имеют одинаковую глубину, будут отображаться в порядке создания - сверху последние созданные.
Persistent: Делает объект постоянным. Постоянные объекты не исчезают при переходе в другую комнату, они существуют постоянно, постоянно реагируют на события и выполняют действия. Так что, такие объекты нужно удалять вручную. Очень полезное свойство для всяких системных объектов, которые следят за вашей игрой и т.д.
Parrent: Задать родительский объект. Об родительских объектах читайте здесь.
Mask: Задаёт спрайт-маску объекту. Маска используется для детекта коллизий. По-умолчанию, за это отвечает стандартный спрайт, но если вы выбрали другой спрайт в качестве маски, именно он будет использоваться для коллизий, хотя стандартный спрайт будет отображаться по-прежнему. Очень часто нужно, чтобы объект реагировал на столкновения с другими объектами по спрайту совсем другой формы, чем его родной спрайт.
Show Information: Показывает подробную информацию по объекту в отдельном окне и удобочитаемом формате.
Поля Events и Actions: Это списки событий, на которые реагирует данный объект и действия, которые он при этом выполняет. Более подробно об этом читайте здесь.

А теперь самое время поговорить об образцах объектов.

Образцы объектов (Instances)

Если мыслить гуманитарно и при этом представить, что объект - это биологический вид какого-то животного, то образец объекта - это каждый представитель этого вида. Такая маленькая пугливая копия великого и могучего. Именно образцы объектов участвуют в вашей игре. Но, если вы назовёте образец объектом, ошибки не будет (можете даже называть их экземплярами). Однако, иногда важно различать объект и его образцы. Каждый образец - точная копия своего объекта, хотя в процессе игры может измениться и совершенно отличаться от других таких же образцов объекта. Образцы объектов можно создавать и удалять во время игры и делать с ними то, что заблагорассудится. Итак, объект - это основа, образец - конкретный представитель в игре, к которому можно обращаться по номеру.
У каждого образца в игре есть свой уникальный числовой номер (говоря научно, идентификатор), которые начинаются со значений больше 100000. Именно по идентификатору можно обратиться к конкретному образцу в игре, ведь у вас таких образцов может быть очень много, а вам нужен именно вот этот - конкретный я назову его Билли. Так вот, если в комнате есть всего один Билли образец объекта, например, главного героя, вы можете обращаться к нему по имени объекта. Иначе, по имени объекта вы обратитесь лишь к самому первому из созданных образцов. Поэтому, в каждом из образцов есть свойство (встроенная переменная, самих свойств у объектов очень много) под названием id, которую нельзя изменить и которая содержит идентификатор - т.е. Билли уникальный номер этого образца.

Обращение к образцам объектов и особые объекты

В каждом объекте вы можете огласить переменные, которые будут использоваться им для игры и являться персональными. Эти переменные называются локальными переменными объекта (важно не путать с обычными локальными переменными, поэтому, для простоты понимания будем использовать просто "переменные объекта или образца"). Тоже самое касается свойств объекта - встроенных разработчиками переменных, которые влияют на характеристики объекта (значения многих можно менять, некоторых - нельзя). Эти переменные окрашиваются в редакторе в особый цвет, потому их невозможно спутать. Вот только создать переменную с именем свойства у вас не получится :)
Примечание: то, о чём я буду рассказывать дальше, касается лишь gml-кода, я понятия не имею, как конкретные образцы идентифицируются через гуи-иконки. Так что крайне приветствуется хоть какие-то познания в программировании.
Итак, нам нужно, чтобы один образец объекта мог получить или сменить значение какой-то переменной из другого образца этого или совсем другого объекта. Нам не важно какой переменной - ту, что вы огласили сами, например, текущее здоровье или количество патронов, или переменную-свойство.
Давайте из другого образца обратимся к образцу Билли и поменяем свойство x (эта переменная содержит координату объекта по оси Х, можно менять для перемещения объекта).
Если объект у нас в комнате один, всё просто - вспоминаем предыдущий пункт статьи и обращаемся к образцу по имени объекта.
obj_billy.x = 200
Хм, вроде всё просто. Как видите, мы просто написали имя объекта, а через точку - его переменную и тут же изменили её. Это же работает и в обратную сторону:
a = obj_billy.x
Надеюсь, вы догадались, что мы передали в переменную а значение координаты х образца Билли? Вроде понятно.
Так, но вот что делать, если образцов в комнате появилось несколько? А вот тут и начинаются пляски с бубном. Есть разные варианты идентифицировать конкретный образец.
Например, вы можете в скобках написать его уникальный номер, если вы его знаете. Обычно, это применимо образцам, которые вы расставили в редакторе комнаты - там вы сможете увидеть номер образца на нижней панели, наведя на него курсор.
(100500).x = 200
Это очень неудобный способ, не так ли?
Тогда допустим, вы создаёте объекты в комнате в процессе игры. Самый лучший вариант - записать только что созданный образец в переменную. Образцы создаются с помощью функции instance_create(x, y, obj). Функция возвращает идентификатор нового образца, т.е. его id.
neb = instance_create(250, 350, obj_billy)
Теперь в переменной neb у нас содержится только что созданный образец Билли. Вот теперь мы и поменяем ему x (Примечание: хотя, по сути, это бессмысленно. Ведь мы же создали образец уже по нужным нам координатам х:250, y:350. Но так тому и быть. Кстати, не воспринимайте буквально слова об образце в переменной. На самом деле, в переменной записан идентификатор образца. Нюансы движка. Пока не вникайте, я выразился так для простоты):
neb.x = 200
Совсем другое дело! Следующий код также будет верным и работать аналогично:
(instance_create(250, 350, obj_billy)).x = 200
В этом случае мы просто больше не сможем обратиться к Билли снова, поскольку у нас нигде не будет записан его идентификатор. Однако, иногда большего и не требуется.
Или вовсе наркомания так:
neb = instance_create(250, 350, obj_billy)
bub = neb
bub.id.x = 200
Ещё для идентификации образцов можно использовать конструкцию with. Есть также и другие способы идентификации, но для начала подойдут и эти.

Пора поговорить об особых объектах: self, other, noone, all. Они выполняют особую функцию и облегчают нам жизнь хоть в чём-то*
  • self - это сам же объект. Вы не поверите, как часто это может понадобиться. Ведь образцу может понадобиться иногда обращаться к самому себе!**
  • other - это объект, который столкнулся с нашим объектом (событие коллизии). Ещё, объектом other будет выступать объект вне конструкции with, тот, который её вызвал, для объектов внутри конструкции (и зачем вы это прочитали).
  • noone - ни один объект, или несуществующий объект с id = -4. Тоже иногда может пригодиться.
  • all - все образцы в игре. Смотрим пример:
all.x = 200
Теперь координата Х всех образцов всех объектов в игре станет равна 200.
* Убер лжот.
** Здесь экспрессия для пущей драматичности момента. На самом деле, не всё так страшно.

Послесловие

В общем, я думаю, для начала новичку вполне достаточно этой информации, понимание всех нюансов придёт со временем. Кое-что может показаться сложным, но не настолько, чтобы немного погодя в этом не разобраться самому. Главное - практика, опыт и понимание придут со временем.
Важно помнить, что объекты - это наше всё, именно благодаря им мы можем создать игру, описать ими геймплей и игровую логику.
`
ОЖИДАНИЕ РЕКЛАМЫ...