Gamemakertips
Deze pagina bevat een verzameling losse tips voor het werken met GameMaker. Dit is dus géén tutorial. Het is bedoeld voor leergierige spelmakers die op zoek zijn naar algemene tips.
De lijst
Globals voor globale zaken
Er zijn drie soorten variabelen. Globale variabelen, instantievariabele en lokale variabelen. Kies het juiste type voor de juiste toepassing:
- globale variabelen voor dingen die het hele spel aangaan
- instantie variabelen voor dingen die bij een instantie horen
- lokale variabelen voor dingen die bij een script of codeblok horen en daarna niets meer doen
Het huidige level zou ik bewaren in een instantievariabele in een persistent controllerobject. Door het controllerobject te vernietigen en een nieuw te maken, kun je zo eenvoudig een nieuw spel beginnen.
Controllerobject
Het is handig om een persistent controllerobject te hebben voor algemene taken in het spel, zoals
- het in de juiste volgorde aanmaken van de andere belangrijke objecten (speler, hud, ...),
- de tijd bewaken,
- controleren wanneer een level is uitgespeeld of wanneer je naar de volgende room mag,
- vijanden en bonussen genereren.
Variabelencontainers
Objecten hoeven niet per se iets te doen. Als je bijvoorbeeld een racespel maakt, zou je een apart object voor het circuit kunnen maken. En dan is het makkelijk om bijvoorbeeld te praten over track.length.
Mask: geen animatie
Als het collisiongebied van een instantie verandert, kan die daarna overlappen met muren. Dit zorgt er vaak voor dat instanties blijven hangen in muren, doordat het draaien ineens een overlapping (collision) creëert die niet is gecheckt. Los dit op door je instantie een mask te geven. Gebruik een aparte sprite als masker. Het is helemaal niet erg als die niet op de pixel nauwkeurig klopt met de getekende sprite. Dat is in veel games niet zo.
Dummysprites
Kan aan alle objecten een sprite toe om ze herkenbaar te maken in de resource tree.
Maak d3d_modellen (ook in 2D)
Ook in 2D-games kun je d3d_modellen gebruiken om primitives in op te slaan. Dingen die niet elke stap verandern kun je op die manier veel sneller tekenen.
Hou bij welke variabelen je hebt
Zorg dat je van al je instanties weet wat hun instantievariabelen zijn en waar die voor zijn, en een lijst met alle globals. Als je project groeit is het heel handig dat je daar overzicht over hebt.
Maak een startroom
Maak een dummyroom als eerste room in je spel en zet daarin alleen één instantie van je persistente controllerobject. Laat dat object de belangrijkste zaken doen op de juiste volgorde, zodat je zeker weet dat alles werkt. Ga daarna direct naar de volgende room.
Een van de dingen die je in die dummyroom alvast kan doen, is de andere rooms de juiste afmetingen geven. Je mag namelijk niet de afmetingen van de actieve room aanpassen.
User Defined events
Voor elk object zijn zestien User Defined events beschikbaar. Deze events worden nooit automatisch geactiveerd, en kun je alleen activeren met event_user(n). Als een bepaalde gebeurtenis op meerdere momenten moet kunnen voorkomen, kun je die in zo'n event zetten. Je roept dan gewoon bovenstaande functie aan om het uit te voeren. Op die manier hoef je de code voor de gebeurtenis niet te kopiëren.
Persistentie
Instanties worden vernietigd als van room wordt gewisseld, tenzij die instanties persistent zijn. Je controllerobject is een goede kandidaat om persistent te maken. Alle spelbrede gegevens kunnen dan daar in.
Ook rooms kunnen persistent zijn. Als je een persistente room verlaat en daarna terugkeert, is de room nog hetzelde als toen je hem verliet. Bij een niet-persistente room zou bij het opnieuw bezoeken alles weer op de beginpositie staan.
Meerdere vormen muren
Als je een level bouwt met duizend blokjes erin kost dat heel veel rekentijd, ook al doen die blokjes niks. Beter maak je muurstukken van verschillende groottes (dat zijn dus verschillende objecten), waardoor je minder instanties nodig hebt om je muren op te bouwen. Geef al die objecten dezelfde ouder (een algemeen muurobject) waarmee je de botsingen controleert. Dit scheelt rekentijd.
60 fps
In games met relatief veel beweging, zet de roomsnelheid altijd op 60. Dat is zo veel prettiger voor het oog dan 30, omdat de verversingsfrequentie van veel beeldschermen 60 Hz is.
Niet alles elke stap controleren
Of het level is uitgespeeld hoef je niet 60 keer per seconde te controleren. Eén keer per seconde is genoeg. Dat kan door een Alarm event zijn eigen alarm te laten activeren. Dit spaart rekentijd uit.