Het ontwerpen van spellen met Game Maker
Verplaatsen
Goed beschouwd is de beweging van object instanties een belangrijk aspect van spellen. Elke instantie heeft twee ingebouwde variabelen x en y die de positie van de instantie aangeven. Om precies te zijn, zij geven de plaats aan waar de oorsprong van de sprite zich bevind. Positie (0,0) is the linker bovenhoek van de room. Je kunt de positie van instanties wijzigen door de x en y variabele te wijzigen. Als je wilt dat het object gecompliceerde bewegingen moet kunnen maken moet je het zo doen. Normaal gesproken plaats je deze code in het step-event van het object.Als het object zich met een constante snelheid en richting voortbeweegt, is er een makkelijker manier om dit te doen. Elke object instantie heeft een horizontale snelheid (hspeed) en een verticale snelheid (vspeed). Beide geven pixels per stap weer. Een positieve horizontale snelheid geeft een beweging naar rechts, een negatieve horizontale snelheid een beweging naar links. Positieve verticale snelheid is naar beneden gericht en negatieve verticale snelheid naar boven. Dus je hoeft deze variabelen (x en y) slechts een keer (bijvoorbeeld in het creatie-event) in te stellen om de object instantie een constante beweging te geven.
Er is nog een andere manier om beweging te specificeren, gebruikt makend van richting (in graden 0-359), en snelheid (mag niet negatief zijn). Je kunt deze variabelen instellen en uitlezen om zelf een beweging te specificeren. (Het programma wijzigt deze waarden naar de juiste hspeed en vspeed.) Ook is er de mogelijkheid om wrijving en zwaartekracht in te stellen. Tenslotte is er de functie motion_add(dir,speed) om een beweging toe te voegen aan de huidige beweging.
Om compleet te zijn, elke instantie heeft de volgende variabelen en functies die een relatie hebben met positie en beweging:
x De x-positie.
y De y-positie.
xprevious De vorige x-positie.
yprevious De vorige y-positie.
xstart De x-positie waarmee de instantie start in de room.
ystart De y-positie waarmee de instantie start in de room.
hspeed Horizontale component van de snelheid.
vspeed Verticale component van de snelheid.
direction De huidige richting (0-360, tegen de klok in, 0 = naar rechts).
speed De huidige snelheid (pixels per step).
friction Huidige wrijving (pixels per stap).
gravity Huidige hoeveelheid zwaartekracht (pixels per step).
gravity_direction Richting van de zwaartekracht (270 is naar beneden).
motion_set(dir, speed) Stelt de beweging in met de gegeven richting en snelheid.
motion_add(dir, speed) Voegt de beweging toe aan de huidige beweging (als een vectortoevoeging).
Er is een groot aantal functies beschikbaar die je help in het definiƫren van bewegingen:
place_free(x, y) Geeft terug of de instantie geplaatst op positie (x,y) botsingvrij zou zijn. Dit wordt bijvoorbeeld gebruikt als controle voordat er daadwerkelijk naar de nieuwe positie wordt bewogen.
place_empty(x, y) Geeft terug of de instantie geplaatst op positie (x,y) iemand ontmoet. Dus deze functie neemt ook niet-solid instanties mee in de berekening.
place_meeting(x, y, obj) Geeft terug of de instantie geplaatst op positie (x,y) obj ontmoet. obj kan een object zijn in welk geval de functie true teruggeeft als een instantie van de object wordt ontmoet. obj kan ook een instantie id zijn, het speciale woord all betekend of de instantie een object ontmoet, of het speciale woord other.
place_snapped(hsnap, vsnap) Geeft terug of de instantie is uitgelijnd met de uitlijnafstand.
move_random(hsnap, vsnap) Beweegt de instantie naar een vrije, willekeurige, uitgelijnde positie, als de bijbehorende actie.
move_snap(hsnap, vsnap) Lijnt de instantie uit, als de bijbehorende actie.
move_wrap(hor, vert, margin) Verplaatst de instantie als het buiten de room is naar de andere zijde. hor geeft aan of er horizontaal moet worden verplaatst en vert geeft aan of er verticaal moet worden verplaatst. margin geeft aan hoe ver de oorsprong van de instantie buiten de room moet liggen alvorens te verplaatsen. Dus het is een marge om de room. Normaal gesproken gebruik je deze functie in de Outside-event.
move_towards_point(x, y, sp) Verplaatst de instantie met snelheid sp naar punt (x,y).
move_bounce_solid(adv) Stuitert tegen solid instanties, als de bijbehorende actie. adv geeft aan of geavanceerde stuiter moet worden gebruikt, die met schuine muren rekening houdt.
move_bounce_all(adv) Stuitert tegen alle instanties, in plaats van alleen tegen solid instanties.
move_contact_solid(dir, maxdist) Verplaatst de instantie in de richting tot een contact positie met een solid object is gereikt. Als er geen botsing is op de huidige positie, wordt de instantie daar geplaatst dat er nog net geen botsing is. Als er al een botsing is wordt de instantie niet verplaatst. Je kunt de maximale afstand of te verplaatsen aangeven (gebruik een negatief getal voor een berekende afstand).
move_contact_all(dir, maxdist) Hetzelfde als de vorige functie, maar deze keer stop je als er een contact is met welk object ook, solid of niet.
move_outside_solid(dir, maxdist) Verplaatst de instantie in de richting tot het niet meer in een solid object ligt. Als er op de huidige positie geen botsing is wordt de instantie niet verplaatst. Ook kun je de maximale afstand aangeven (gebruik een negatief getal als je geen maximale afstand wilt).
move_outside_all(dir, maxdist) Hetzelfde als de vorige functie, maar deze keer verplaats je tot buiten elk object, solid of niet.
distance_to_point(x, y) Geeft de afstand van de botsingsrechthoek van de huidige instantie naar (x,y) terug.
distance_to_object(obj) Geeft de afstand van de instantie naar de dichtstbijzijnde instantie van object obj terug.
position_empty(x, y) Geeft terug of de positie (x,y) leeg is.
position_meeting(x, y, obj) Geeft terug of er op positie (x,y) een instantie is van obj. obj kan een object zijn, een instantie id, of een van de sleutelwoorden self, other, of all.