Дополнительно об объектах
Когда Вы создаёте объект в расширенном режиме, то можете изменить некоторые дополнительные установки.
Глубина
Прежде всего, Вы можете установить Глубину (Depth) образцов объекта. Когда образцы отдалены на экране, они отдаляются в соответствии с их глубиной. Образцы с максимальной глубиной отдаляются первыми. Образцы с минимальной глубиной отдаляются в последнюю очередь. Когда образцы имеют одинаковую глубину, то они отдаляются на то значение, в котором они были первоначально созданы. Если Вы хотите проверить, что объект находится ближе всех остальных - укажите для него отрицательную глубину. Если Вы хотите удостовериться, что данный образец находится дальше (удалённее) других образцов, присвойте ему положительную глубину. Вы можете также изменять глубину образца объекта в течение игры, используя переменную называемую depth.
Постоянные объекты
Во-вторых, Вы можете сделать объект Постоянным (Persistent). Постоянный объект продолжает существовать, даже когда Вы переходите из одной комнаты в другую. Он исчезает только тогда, когда Вы явным образом его уничтожаете. Таким образом, Вам достаточно поместить образец объекта в первой комнате, после чего он останется доступным во всех остальных комнатах. Это здорово, когда Вы имеете, например, основного персонажа, который перемещается из комнаты в комнату. Использование постоянных объектов - мощный механизм, но он также легко может привести к ошибкам.
Родители
Каждый объект может иметь материнский объект. Когда объект имеет родителя (parients), он наследует его поведение. Говоря иначе, такой объект - это своего рода специальное событие родительского объекта. Например, если Вы имеете 4 различных шарика, имеющих названия: ball1, ball2, ball3 и ball4, и все они ведут себя одинаково, но имеют разные спрайты. Вы можете сделать ball1 родителем трёх других. Теперь Вы должны только определить событие для ball1. Другие наследуют это событие и будут вести себя точно так же. Также, когда Вы применяете действия к образцам родительского объекта, они также будут применяться к дочерним объектам. Так, например, если Вы уничтожаете все образцы ball1, то образцы ball2, ball3 и ball4 также будут уничтожены. Это сэкономит массу времени.
Зачастую, объекты ведут себя почти одинаково, но при этом между ними всё-таки существуют некоторые небольшие различия. Например, один монстр может двигаться вверх и вниз, а другой - влево и вправо. В остальном же, они имеют одинаковое поведение. В этом случае почти все события должны иметь те же самые действия, но одно или два события могут быть различны. Мы снова можем сделать один объект родителем другого. Но в этом случае мы также определяем достоверные события для дочернего объекта. Эти события анулируют (override) материнские события. Так всякий раз, когда случай для дочернего объекта содержит действия, они выполняются вместо события родителя. Если Вы хотите выполнить материнское событие, то можете вызвать так называемое наследственное (inherited) событие, используя соответствующее действие.
Это действительно хорошая практика для создания одного базового объекта. Такой объект будет содержать всё поведение по умолчанию и никогда не будет использован в игре. Материнские объекты могут сами иметь родителей и т. д. (Очевидно, Вам не удасться создать циклы). Таким образом Вы можете создать иерархию объектов. Это чрезвычайно полезно для того, чтобы содержать свою игру структурированной, и настоятельно советуем Вам поучиться использовать этот механизм.
Также имеется другое применение для материнского объекта. Оно также наследует поведение столкновений для других объектов. Позвольте объяснить это на примере. Предположим, что Вы имеете четыре различных объекта пола. Когда шарик ударяется о пол - он должен изменить направление. Это должно быть определено в событии столкновения шарика с полом. Поскольку имеется четыре различных поверхности пола, мы должны поместить код в четыре различных события столкновения шарика. Но когда Вы делаете одну поверхность пола родителем трёх остальных, то должны определить событие столкновения только с этим полом. Другие столкновения исполнят то же самое событие. Получается, что это спасает нас от большого числа копирований.
Из этого следует, что везде, где Вы используете объект, подразумеваются также и его потомки. Это происходит, когда в действии Вы указываете, что данное действие должно применяться к образцам некоторого объекта. Это также происходит, когда Вы используете инструкцию with() в коде (смотрите ниже). Также это работает при вызове функций, таких как: instance_position, instance_number и т.д. Наконец, это работает, когда Вы обращаетесь к переменным других объектов. В примере, приведённом выше, когда Вы устанавливаете значение для ball1.speed равное 10, то оно применяется также к ball2, ball3 и ball4.
Маски
Когда два образца сталкиваются, происходит событие столкновения. Чтобы проверить, пересекаются ли два образца, используются спрайты. Это в большинстве случаев работает замечательно, но иногда Вы можете захотеть, чтобы столкновения базировались на иной основе. Например, если Вы создаёте изометрическую игру, то объекты обычно имеют высоту (для придания им трёхмерного представления). Но для столкновений Вы хотите использовать только наземную часть спрайта. Это может быть достигнуто, созданием отдельного спрайта, который используется как маска столкновения для объекта.
Информация
Кнопка Show Information предоставляет обзор всей доступной информации об объекте, которая также может быть определена. Это действительно полезно, когда Вы освобождаете обзор всех действий и событий.