Конструкции With (С)

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

ball.y = ball.y + 8;

Но это не верно. Правая сторона присваивания получает значение y-координаты первого шарика и добавляется к нему 8. Затем это новое значение устанавливается как y-координата для всех шариков. Таким образом, в результате все шарики получают ту же самую y-координату. Инструкция

ball.y += 8;

будет иметь точно такой же эффект, потому как это просто сокращение первой инструкции. Так, каким же образом сделать это? Для этой цели имеется инструкция with. Её глобальная форма

with (<выражение>) <инструкция>

<выражение> указывает один или большее количество образцов. Для этого Вы можете использовать идентификатор образца, имя объекта (чтобы указать все образцы этого объекта) или один из специальных объектов (all, self, other, noone). <инструкция> теперь выполняется для каждого из обозначенных образцов, как будто этот образец - текущий (self) образец. Таким образом, чтобы переместить все шарики на 8 пикселей вниз, Вы можете напечатать.

with (ball) y += 8;

Если Вы хотите выполнить множество инструкций - поместите их в фигурные скобки. Например, чтобы переместить все шарики в случайную позицию, Вы можете использовать

with (ball)
{
  x = random(room_width);
  y = random(room_height);
}

Обратите внимание, что в пределах инструкции(ий), обозначенный образец становится самостоятельным (self) образцом. В пределах инструкций оригинал самостоятельного образца становится другим (other) образцом. Например, чтобы переместить все шарики в позицию текущего образца, Вы можете напечатать

with (ball)
{
  x = other.x;
  y = other.y;
}

Использование инструкции with является чрезвычайно мощным инструментом. Позвольте привести ещё несколько примеров. Чтобы уничтожить все шарики, Вы печатаете

with (ball) instance_destroy();

Если взрывается бомба, и Вы хотите уничтожить все находящиеся рядом с ней образцы, можете использовать

with (all)
{
  if (distance_to_object(other) < 50) instance_destroy();
}