DuCats Games DuCats Games

Трудимся над Мечеломом)
Обновляем локации. Добавили кучу новой травы и растений + немного эффектиков + горы! Теперь пейзажи стали гораздо красивее.

РОМАН РОМАН

Работаю над роботом пауком ходящем по стенам.
ВК: https://vk.com/co_of_co

ASH2 ASH2

Тестируем электрическую сеть.
ВК: https://vk.com/snail_ninja

Jusper Jusper

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

Tartal Tartal

Jusper, с первыми двумя моментами я всё понял и принял.
А вот с третьим немного не разобрался. Ты имеешь ввиду, что область вокруг глаза-импланта должна быть искажена и повреждена намного сильнее?

Jusper Jusper

Tartal,

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

...
Tartal Tartal

Потихоньку доделал концепт-портрет главного героя:

Jusper Jusper

Чем-то напомнило мне мотоциклы из Throne: Legacy, только обернутые в оформление харконеннов из Emperor: Battle for Dune.

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

alexprey alexprey

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

alexprey alexprey

kirsakshlil, вспомнил, тоже в свое время пытался с этой штукой баловаться когда только обзавелся планшетом. Но дело дальше простых утилит не пошло)

kirsakshlil kirsakshlil

alexprey, мобильная среда разработки, использующая Java.

alexprey alexprey

kirsakshlil, милота) APDE это что такое, что то не слышал про такое..

kirsakshlil kirsakshlil

alexprey, о, ахах, я тоже как-то начинал делать что-то в этом духе, только в APDE. Ручная отрисовка GUI - та еще муть :с . Правда, работать прямо в телефоне не очень удобно. Зато весело, хех. По факту не более чем баловался...

ASH2 ASH2

Jusper, спасибо. Нет, просто "типичный портрет").

Jusper Jusper

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

...
Jusper Jusper

ASH2,

Рисовка хорошая, я уже говорил ранее.

ASH2 ASH2

Когда личное пространство имеет значение.
ВК: https://vk.com/snail_ninja

alexprey alexprey

Освещение хорошо смотрится)

Логотип проекта Game Maker

Объекты в 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.

* Убер лжот.//** Здесь экспрессия для пущей драматичности момента. На самом деле, не всё так страшно.//

Послесловие

В общем, я думаю, для начала новичку вполне достаточно этой информации, понимание всех нюансов придёт со временем. Кое-что может показаться сложным, но не настолько, чтобы немного погодя в этом не разобраться самому. Главное - практика, опыт и понимание придут со временем.
Важно помнить, что объекты - это наше всё, именно благодаря им мы можем создать игру, описать ими геймплей и игровую логику.



Хорошо написано что такое объекты и инстансы. И ведь применимо к любому ооп-языку. Классно, для новичков - самое то.

Справка