With-rakenteet

Kuten aiemmin mainittiin, on mahdollista lukea ja muuttaa toisten instanssien muuttujia. Joissain tapauksissa halutaan kuitenkin tehdä instansseilla vielä enemmän, vaikkapa siirtää kaikkia palloja kahdeksan pikseliä alaspäin. Seuraava koodinpätkä saattaisi kuulostaa oikealta:

ball.y = ball.y + 8;

Se ei kuitenkaan toimi. Sijoituksen oikealle puolelle saadaan ensimmäisen pallon y-koordinaatti, johon lisätään kahdeksan. Sitten saatu uusi arvo asetetaan kaikkien pallojen y-koordinaatiksi, jolloin ne kaikki saavat saman y-koordinaatin. Lause

ball.y += 8;

toimii täsmälleen samalla tavalla, koska se on vain edellisen lauseen lyhyempi muoto. Miten päästään siis haluttuun lopputulokseen? Tähän tarkoitukseen on olemassa with-lause. With-lause on muotoa

with (<lauseke>) <lause>

<lauseke> vastaa yhtä tai useampaa instanssia, ja siinä voidaan käyttää instanssin id-tunnistetta, objektin nimeä (jolloin valitaan kaikki objektin instanssit) tai jotakin erikoisobjektia (all, self, other, noone). Nyt <lause&rt; suoritetaan jokaiselle instanssille erikseen kuin ne olisivat nykyisiä (self) instansseja. Palloja voidaan siis siirtää kahdeksan pikseliä alaspäin seuraavasti:

with (ball) y += 8;

Jos halutaan suorittaa useampia lauseita kerralla, niiden ympärille tulee laittaa aaltosulut. Jos siis halutaan esimerkiksi siirtää kaikki pallot sattumanvaraisiin sijainteihin, voidaan käyttää seuraavaa koodia:

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

Huomaa, että with-lauseen sisällä self-instanssilla viitataan with-lauseen määräämään instanssiin, ja alkuperäinen instanssi on muuttunut other-instanssiksi. Jos siis halutaan siirtää kaikki pallot nykyisen instanssin sijaintiin, voidaan käyttää seuraavaa koodia:

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

With-lausetta voidaan käyttää hyvin tehokkaasti. Tässä pari lisäesimerkkiä. Kaikki pallot voi tuhota seuraavasti:

with (ball) instance_destroy();

Jos pelissä räjähtää pommi ja kaikki sen lähellä olevat instanssit halutaan tuhota, voidaan käyttää seuraavaa koodia:

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