Door deze tutorial te volgen kunt u elk spel waarbij alleen de pijltjestoetsen nodig zijn, laten besturen met de pijltjestoetsen, de cijfertoetsen 2, 4, 6 en 8 op het numerieke toetsenbord, de toetsen W, A, S en D aan de linkerkant van het toetsenbord (er wordt hier uitgegaan van een QWERTY-toetsenbord) en de x- en y-assen van maximaal twee gamecontrollers. Dit scriptpakket biedt de speler van uw spel dus extra/verschillende mogelijkheden om het spel te besturen zonder dat deze daar instellingen voor hoeft te wijzigen. Als uw spel behalve de pijltjestoetsen nog meer toetsen gebruikt, kun u die zelf aan dit pakket toevoegen. Daarna wordt uitgelegd hoe voor verschillende soorten beweging deze codes toegepast moeten worden.
Klik hierboven op een kop om naar het bijbehorende tekstgedeelte te springen.
In een Game Start Event moet u allereerst de volgende code plaatsen, die verschillende gelijkwaardige toetsen van het toetsenbord aan elkaar koppelt:
keyboard_set_map(vk_numpad4, vk_left); keyboard_set_map(vk_numpad6, vk_right); keyboard_set_map(vk_numpad8, vk_up); keyboard_set_map(vk_numpad2, vk_down); keyboard_set_map(65, vk_left); // ord("A") == 65 keyboard_set_map(68, vk_right); // ord("D") == 68 keyboard_set_map(87, vk_up); // ord("W") == 87 keyboard_set_map(83, vk_down); // ord("S") == 83
Nu kunt u de volgende vier scripts toevoegen. Geef elk de naam die bovenin is vermeld. Al deze scripts retourneren of er een knop is ingedrukt die de aangegeven richting aanwijst: check_left() retourneert bijvoorbeeld true als er op pijl-links, op A, of op 4 op het numerieke toetsenbord wordt gedrukt, of als een van de gamecontrollers naar links wordt bewogen.
// Scriptnaam: check_left return keyboard_check(vk_left) || joystick_xpos(1) < -1/3 || joystick_xpos(2) < -1/3;
// Scriptnaam: check_right return keyboard_check(vk_right) || joystick_xpos(1) > 1/3 || joystick_xpos(2) > 1/3;
// Scriptnaam: check_up return keyboard_check(vk_up) || joystick_ypos(1) < -1/3 || joystick_ypos(2) < -1/3;
// Scriptnaam: check_down return keyboard_check(vk_down) || joystick_ypos(1) > 1/3 || joystick_ypos(2) > 1/3;
Hierbij moet worden opgemerkt dat de zogenaamde dode zone van de gamecontrollers in beide richtingen is gekozen op een derde van het bereik. De dode zone bepaalt hoe ver de gamecontroller moet worden bewogen voordat het spel daarop reageert. Dit kan eventueel veranderd worden door dit getal in bovenstaande scripts te vervangen.
Nu we deze scripts hebben, kunnen we beginnen met het programmeren van de beweging zelf. We beginnen met een vrije beweging waarbij tegelijkertijd horizontaal en verticaal bewogen kan worden. Er zijn dan dus negen richtingen mogelijk. We komen dan uit op de volgende code:
var left, right, up, down; left = check_left(); right = check_right(); up = check_up(); down = check_down(); if(left && !right) x += 4; if(right && !left) x -= 4; if(up && !down) y -= 4; if(down && !up) y += 4;
Zoals u ziet is dit niet heel moeilijk te realiseren. Eerst wordt de invoer gecontroleerd, daarna wordt deze eenvoudig verwerkt tot een beweging. Het uitroepteken heeft de betekenis niet en controleert dus of er geen instructie tot beweging in die richting is gegeven. Deze code dient in het Step Event te worden geplaatst, aangezien elke stap van het spel de beweging opnieuw dient te worden gecontroleerd. Er is hier voor een bewegingssnelheid van vier pixels per stap gekozen.
In sommige gevallen wilt u wellicht de mogelijkheid om diagonaal te bewegen voorkomen. Hiertoe is slechts een kleine aanpassing van de vorige code nodig:
var left, right, up, down;
left = check_left();
right = check_right();
up = check_up();
down = check_down();
if(!up && !down)
{
if(left && !right)
x += 4;
if(right && !left)
x -= 4;
}
if(!left && !right)
{
if(up && !down)
y -= 4;
if(down && !up)
y += 4;
}
Het is vrij duidelijk te zien dat deze code ervoor zorgt dat wanneer de speler bijvoorbeeld tegelijk omhoog en naar links probeert te bewegen, hij stil komt te staan: hij beweegt pas in een van deze richtingen als hij de andere richting loslaat.
In veel spellen is het speelveld een rooster. Het kan dan wenselijk zijn om de beweging nog verder te beperken: er mag dan alleen per roostervakje bewogen worden. Het gevolg is dat de invoer alleen bekeken wordt indien de speler zich precies op een roostervakje bevindt: halverwege een roostervakje heeft de speler geen controle en gaat de beweging gewoon door. We kunnen daarom niet meer direct de coördinaten van het object aanpassan: we moeten nu met de snelheidsvariabelen gaan werken. Dit heeft als gevolg dat de snelheid ook teruggezet op nul moet worden zodra de toetsen zijn losgelaten. Dit alles dient alleen te worden gedaan indien het object zich op dit moment op een roostervakje bevindt. Het een en ander leidt ons tot de volgende code:
if(place_snapped(32, 32)) { var left, right, up, down; left = check_left(); right = check_right(); up = check_up(); down = check_down(); speed = 0; if(!up && !down) { if(left && !right) hspeed = 4; if(right && !left) hspeed = -4; } if(!left && !right) { if(up && !down) vspeed = -4; if(down && !up) vspeed = 4; } }
Met de functie place_snapped() wordt eerst gecontroleerd of het object zich op een roostervakje bevindt in een rooster van 32 bij 32 pixels. Ook wordt voordat de nieuwe invoer wordt bekeken, de snelheid eerst teruggezet op nul, zodat bij geen invoer het object weer stil komt te staan. Het is bij deze code belangrijk dat de afmeting van een roostervakje (hier 32) deelbaar is door de snelheid (hier 4), want anders zou u zomaar vakjes kunnen gaan overslaan.
Opmerkingen en vragen over deze tutorial kunnen worden geplaatst in het gastenboek. Gelieve daarbij duidelijk te vermelden om welke tutorial het gaat. Ik heb nog meer tutorials over andere aspecten van Game Maker geschreven:
Er is ook een introductie tot Game Maker op deze website beschikbaar, evenals informatie over de verschillende Game Maker-cursussen waaraan ik heb meegewerkt.