With-rakenteet

Kuten aiemmin olemme huomanneet, on mahdollista lukea ja muuttaa toisten instanssien muuttujia. Monissa tilanteissa voit kuitenkin haluta vaikuttaa toisiin instansseihin paljon enemmän. Voit esimerkiksi haluta siirtää kaikkia ball-objektin instansseja 8 pikseliä alaspäin. Luultavasti ajattelet ensin, että se toteutetaan seuraavalla koodinpätkällä:

ball.y = ball.y + 8;

Tämä ei kuitenkaan ole oikein. Sijoituksen oikea puoli ottaa talteen ensimmäisen ball-objektin y-koordinaatin ja lisää siihen 8. Sitten tämä arvo asetetaan kaikkien ball-objektien y-koordinaatiksi. Tulos on siis, että kaikki ball-objektit saavat saman y-koordinaatin. Lauseella

ball.y += 8;

on täysin sama vaikutus, koska se on vain ensimmäiseksi kirjoitetun lauseen lyhenne. Miten siis toteutetaan haluttu tapahtuma? Tähän tarkoitukseen on olemassa with-lause. Se on aina muotoa

with (<lauseke>) <lause>

<lauseke> ilmaisee yhtä tai useampaa instanssia. Voit käyttää siinä instanssin id-arvoa, objektin nimeä (joka siis vastaa kaikkia objektin instansseja) tai jotain erityisnimistä (all, self, other, noone). Sitten <lause> suoritetaan kaikilla ilmoitetuilla instansseilla. Kaikkien ball-objekten 8 pikseliä alaspäin siirtämisen tekee siis koodi

with (ball) y += 8;

Jos tahdotaan suorittaa useita lauseita kerralla, niiden ympärille pitää pistää aaltosulkeet. Voit siis esimerkiksi siirtää kaikki ball-objektin instanssit sattumanvaraiseen sijaintiin seuraavalla koodilla:

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

Huomaa, että with-lauseen sisällä olevissa lauseissa instanssista on tullut self-instanssi. Alkuperäisestä self-instanssista eli with-lausetta kutsuneesta instanssista on taas tullut other-instanssi. Voit siis esimerkiksi siirtää kaikki ball-objektin instanssit nykyisen instanssin sijaintiin seuraavalla koodilla:

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

With-lausen käyttö on erittäin tehokasta. Tässä vielä pari esimerkkiä. Tuhotaksesi kaikki ball-objektin instanssit, käytä koodia

with (ball) instance_destroy();

Jos taas vaikkapa pommi räjähtää, ja haluat tuhota kaikki sen lähellä olevat instanssit, voit käyttää tällaista koodia:

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