Game Dev: Конструкция with

Читай на DevTribe.ru!

» Раздел: Game Maker

Предисловие

Это небольшая статья об конструкции with и способах её применения. Предполагается, что вы уже знаете о gml и его синтаксисе, понимаете разницу между объектом и его образцами (образцы объекта), а также знаете о специальных объектах other, all, noone, self.
Примечание: Поскольку в txt2 нет разметки gml-кода, я взял на себя труд выделить ключевые слова, так, как они выглядят по-умолчанию в самом gml, чтобы код выглядел более-менее читабельным.

Общий вид и применение

Конструкция имеет такой вид:
with (<имя объекта>) {<действие>};
или в сокращённой форме:
with <имя объекта> <действие>
Конструкция with имеет несколько применений. Первоначальное применение - конструкция предназначена для выполнения одинаковых действий над всеми образцами объекта, имя которого указано в <имя объекта>. То есть, по сути, это особая форма цикла.
Пример:
with (obj_ball)
{
x+=5
}
Как видно из примера, конструкция в цикле переберёт все образцы объекта obj_ball которые есть в комнате и передвинет их по оси х на 5 единиц вправо.
Кроме того, все действия и переменные, которые выполняются в конструкции with становятся локальными для образца в цикле, а образец, который вызвал with - внешним, и внутри самой конструкции к нему уже нужно обращаться как специальному объекту other.
Конструкция имеет другое важное применение. Она может служить для идентификации конкретного образца, и выполнению над ним действий из другого объекта. Как известно, в gml есть функции, которые работают только для конкретного образца объекта - для того, из которого его вызвали. Примером может служить функция instance_destroy() которая не имеет параметров, и уничтожает тот образец, из которого его вызвали (кстати, единственная функция, которая удаляет объекты).

Примеры

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

Пример 1

Например, при взрыве (событие destroy) объекта "ракета" (obj_rocket), нужно нанести урон ракеты (damage) всем юнитам (obj_unit) в радиусе 150, и у тех, у кого здоровья (current_hp) меньше нуля - уничтожить.
obj_rocket destroy event (событие уничтожения образца объекта obj_rocket):
» Code
with (obj_unit) //Начало цикла
{
if(distance_to_object(other.id)<=150) //как видно, функция distance_to_object() возвращает расстояние от юнита до ракеты, а не наоборот, так как внутри конструкции они меняются местами, и теперь obj_rocket=other.id
{
current_hp-=other.damage //По сути, это сам юнит наносит сам себе урон, а урон мы берём из объекта ракеты.
if(current_hp<=0)
{
instance_destroy() //Вот тут юнит уничтожит сам себя, если его здоровье ниже нуля.
}
}
}
id - это встроенная переменная в любом образце, которая содержит уникальный численный идентификатор образца.

Пример 2

Сделаем все видимые объекты мячей в комнате невидимыми, а невидимые - наоборот.
» Code
with (obj_ball)
{
visible =! visible;
}

Пример 3

С помощью объекта obj_player создадим объект obj_missle, и зададим ему начальную скорость и случайное направление движения. Событие не важно, предположительно, это нажатие на кнопку.
» Code
with (instance_create(15,20,obj_missle).id)
{
speed=10
direction=random(361)
}

Просмотров: 537

Это сообщение удалено