Het ontwerpen van spellen met Game Maker
Verwijzen naar variabelen in een andere instantie
Zoals eerder uitgelegd, kun je variabelen instellen in de huidige instantie door gebruik van een statement zoals:
x = 3;
Maar in een aantal gevallen wil je verwijzen naar variabelen in een andere instantie. Misschien wil je bijvoorbeeld de beweging van alle ballen stoppen, of misschien de hoofdpersoon verplaatsen naar een specifieke positie, of, in het geval van een botsing, zou je misschien de sprite van het andere object in de botsing willen instellen. Dit kan worden bereikt door voor de variabele naam de naam van het object en een punt te plaatsen. Dus bijvoorbeeld, zou je kunnen schrijven:
ball.speed = 0;
Dit zal de snelheid van alle instanties van het object ball veranderen. Er zijn een paar speciale "objecten".
- self: De huidige instantie die de actie uitvoert.
- other: De andere instantie die is betrokken bij een boting in een collision event.
- all: Alle instanties.
- noone: Totaal geen instantie (klinkt waarschijnlijk vreemd maar dit wordt handig zoals we later zullen zien).
- global: Geen instantie, maar een container wat globale variabelen opslaat.
other.sprite_index = sprite5; all.speed = 0; global.message = 'Een goed resultaat'; global.x = ball.x;
Nu zul je je wel afvragen wat de laatste definitie doet als er meer ballen zijn. Nou, de eerste is genomen en zijn x waarde is ingesteld in de globale waarde.
Maar wat nou als je de snelheid wilt instellen van één specifieke bal, i.p.v. alle ballen? Dit is een beetje ingewikkelder. Elke instantie heeft een unieke id. Als je instantie plaatst in een room in de room-editor, is de id van die instantie weergegeven als je de muis stil houd boven de instantie. Deze nummers zijn groter of gelijk aan 10000. Zo'n nummer kan ook worden gebruikt aan de linkse kant van de punt. Maar wees voorzichtig. De punt zal worden geïnterpreteerd als de decimale punt in een nummer. Om dit te vermijden, plaats haakjes er omheen. Dus bijvoorbeeld, als we er vanuit gaan dat de id van de bal 100032 is, zou je kunnen schrijven:
(100032).speed = 0;
Als je een instantie maakt in een programma, de oproep geeft de id terug. Dus een goed stukje programma is
{ nnn = instance_create(100,100,ball); nnn.speed = 8; }
Dit maakt de bal en stelt zijn snelheid in. Merk op dat we de instantie id hebben gedefinieerd in een variabele en hebben deze variabele gebruikt om het object aan te geven voor de punt. Dit is helemaal in orde. Laat ons proberen om dit duidelijker te maken. Een punt is eigenlijk een operator. Het neemt een waarde als linkse operator en een variabele (adres) als rechtse, en geeft het adres van de specifieke variabele in het aangegeven object of instantie. Alle objectnamen, en de speciale objecten zoals hierboven aangegeven variable vertegenwoordigen waarden en deze kunnen worden gebruikt worden zoals elk gewone waarde. Bijvoorbeeld, het volgende programma is in orde:
{ obj[0] = ball; obj[1] = flag; obj[0].alarm[4] = 12; obj[1].id.x = 12; }
Het laatste statement zou gelezen moeten worden zoals volgt. We nemen de id van de eerste vlag. Voor de instantie met die id stellen we de x coördinaat naar 12.
Object namen, de speciale objecten, en de instantie id's kunnen ook worden gebruikt in een aantal functies. Ze worden eigenlijk behandeld als constants in het programma.