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();
}