Het ontwerpen van spellen met Game Maker
With constructies
Zoals eerder aangegeven, is het mogelijk om waarden te lezen en te veranderen van variabelen in andere instanties. Maar in een aantal gevallen wil je veel meer met andere instanties. Bijvoorbeeld, denk je eens in dat je alle ballen 8 pixels naar beneden wilt verplaatsen. Je denkt misschien dat je dit behaalt met dit stukje code
bal.y = bal.y + 8;
Maar dit in niet correct. De rechter kant van de definitie krijgt de waarde van de y-coördinaat van de eerste bal en voegt 8 eraan toe. Daarna is deze nieuwe waarde ingesteld als y-coördinaat voor alle ballen. Dus het resultaat is dat ze hetzelfde y-coördinaat krijgen. Het statement
bal.y += 8;
heeft precies hetzelfde effect omdat het een simpele afkorting van het eerste statement is. Dus hoe bereik je dit? Voor dit doel is er het with statement. Zijn globale vorm is
with (<expression>) <statement>
<expression> geeft 1 of meer instanties aan. Hiervoor kan je het instantie id gebruiken, de naam van een object (om alle instanties van 1 object aan te geven) of 1 van de speciale objecten (all, self, other, noone). <statement> wordt nu uitgevoerd voor elk van deze aangegeven instanties, alsof het de huidige (self) instantie is. Dus, om alle ballen 8 pixels naar beneden te verplaatsen kun je typen.
with (bal) y += 8;
Indien je meerdere statements wilt uitvoeren, plaats dan '{' en '}' om de statements heen. Dus bijvoorbeeld, om alle ballen te verplaatsen naar een willekeurige plek, kun je gebruiken
with (bal) { x = random(room_width); y = random(room_height); }
Merk op dat, in de statement(s), de aangeven instantie de self instantie is geworden. En de originele self instantie wordt de other instantie. Dus bijvoorbeeld, om alle ballen te verplaatsen naar de positie van de huidige instantie, kun je typen
with (bal) { x = other.x; y = other.y; }
Het gebruik van het with statement is erg krachtig. Laat me je nog een paar voorbeelden geven. Om alle ballen te vernietigen kun je typen
with (bal) instance_destroy();
Als een bom ontploft en je wilt alle instanties dichtbij de bom vernietigen, dan kun je typen
with (all) { if (distance_to_object(other) < 50) instance_destroy(); }