Super Mario, de prinseszoekende loodgieter
Mario is ongetwijfeld een van de bekendste videospelpersonages. De kleine dikke loodgieter rent, springt, klimt, vliegt en zwemt zich een weg door allerlei levels met als uiteindelijke doel om Prinses Peach te bevrijden van Bowser.
Mario verscheen als karakter voor het eerst in Donkey Kong (1981) en heette toen nog Jumpman. In 1983 kreeg Mario samen met zijn jongere broer Luigi een eigen spel: Mario Bros. Sindsdien heeft uitgever Nintendo vele versies van Mario uitgebracht.
In dit hoofdstuk maak je een gedeelte na uit Super Mario All-Stars uit 1993.
Leerdoelen: wat kun je na deze oefening?
Je leert in dit spel uitgebreid over toestanden (Engels: states). Je kunt na het maken van dit spel in eigen woorden vertellen in wat voor toestanden Mario zich kan bevinden. Ook kun je de toestandovergangen beschrijven. Met andere woorden: hoe ga ik van toestand A naar toestand B?
Daarnaast staat in dit spel zwaartekracht (Engels: gravity) centraal. Je kunt aan de hand van deze handleiding zelf een spel met zwaartekracht maken.
Ook wordt er gewerkt met een view. Je kunt uitleggen wat dit is. Verder komen overerving en variabelen weer terug. Je kunt in eigen woorden uitleggen waarom het handig is dat er in dit spel overerving is gebruikt. Variabelen kun je instellen en opvragen.
Eerste versie testen
Download nu het zip-bestand (supermario.zip). Open supermario1.gmk en start het spel. Op dit moment werkt de besturing van Mario nog niet goed. De zwaartekracht en verschillende botsingen met objecten moeten namelijk nog worden geprogrammeerd. Lees hieronder wat er al wel werkt.
Verschillende mapjes
Er zijn al 22 objecten gemaakt. Omdat het behoorlijk onoverzichtelijk kan worden met zo'n groot aantal, zijn de objecten gegroepeerd in verschillende mapjes. Zie afbeelding 1.
Kun je raden wat de Parent-objecten zijn? Overerving wordt ook in dit spel gebruikt! De parents zijn obj_mario, obj_platform en obj_enemy.Afbeelding 1. Mapjes in mapjes. Met je rechtermuisknop kun je zelf groups aanmaken.
De testkamer
Er is één level gemaakt om Mario te testen. De kamer maakt gebruik van een view (zie afbeelding 2). Zo'n view zorgt ervoor dat je tijdens het spelen slechts een gedeelte van de kamer ziet. Mario blijft altijd in beeld wanneer je naar links of rechts beweegt.
De view is 320 pixels breed en 240 pixels hoog. Het klopt dus dat je straks een klein venster ziet waarin je het spelletje speelt.Afbeelding 2. Met een view kun je een grote kamer toch klein weergeven.
De verrassing
Het object obj_surprise maakt, als je er tegen aan springt, een groene paddestoel (obj_powerup). Dit mag natuurlijk maar één keer gebeuren, want anders zou je wel erg makkelijk levens kunnen verdienen. Hiervoor wordt de variabele used
gebruikt. De variabele staat standaard op 0 (nog niet gebruikt), en zodra je tegen het blok aanspringt veranderd de waarde van used
in 1. Zie afbeelding 3.
used
? Wellicht krijg je een idee na het lezen van het onderstaande stukje over Koopa.
Afbeelding 3. Als je er tegen aanspringt, wordt used op 1 gezet.
Koopa, het schildpad
Voor het schildpad bestaan drie objecten. Het schildpad kan zich namelijk in drie toestanden bevinden: lopend (obj_koopa), stil liggend (obj_koopa_hit), en schuivend (obj_koopa_killed). In elk van deze toestanden gelden er andere regels. In afbeelding 4 zie je hoe Koopa in de verschillende toestanden terecht komt.
Mario zelf bestaat ook uit verschillende objecten. Het object obj_mario_air is de toestand dat Mario in de lucht is (springt, valt). Het object obj_mario is een parent-object. Een botsing met obj_mario betekent ook een botsing met obj_mario_air.Afbeelding 4. De verschillende toestanden van Koopa.
De belangrijkste dingen zijn nu gezegd. Er werkt echter al veel meer. Speel het spel nog een keer en kijk eens of je kunt zien hoe bepaalde dingetjes zijn geprogrammeerd. Daarna kun je natuurlijk in Game Maker kijken hoe het écht zit. Tip: bekijk ook eens de sprites en de subimages, bijvoorbeeld spr_brick en spr_suprise.
Zelf bouwen
Mario kan zich in verschillende toestanden bevinden. Je gaat er voor zorgen dat Mario kan lopen, springen en bukken. Elke keer moet je goed bedenken in welke toestand (in het Engels: state) je bent en hoe je in een andere toestand komt. Voor de duidelijk zie je in afbeelding 5 een overzicht van de toestanden.
Mario kan dus niet springen terwijl hij bukt. Zie je dat?Afbeelding 5. Schematische weergave van de verschillende toestandsovergangen.
Mario in de lucht
Open nu het al bestaande object obj_mario_air en volg onderstaande stappen.
- Voeg aan het Create-event een Set Gravity-actie toe (tab: move). Typ bij direction
270
en bij gravity de waarde1.5
. Nu valt Mario naar beneden. Het venster ziet er nu zo uit.
Voeg nu een Collision-event toe met obj_platform. Maak afbeelding 7 na met behulp van afbeelding 8
Afbeelding 7. De botsing tussen obj_mario_air en obj_platform.
Pas op voor kleine foutjes!Afbeelding 8. Gebruik deze afbeelding om de acties uit afbeelding 7 toe te voegen.
Het object obj_mario_air is nu klaar. Het spel werkt alleen nog niet. Je valt namelijk nog steeds door de grond heen. Dat lossen we in het volgende gedeelte echter snel op.
Is het bovenstaande niet gelukt? Geen zorgen. Open dan supermario2.gmk om verder te gaan.Mario met zijn voeten op de grond
Open nu het al bestaande object obj_mario_land en volg onderstaande stappen.
- Voeg aan het Create-event een Set Gravity-actie toe (tab: move). Typ bij direction
270
en bij gravity de waarde0
. Nu valt Mario niet meer naar beneden. Het venster ziet er nu zo uit. - Als je nu het spel start, val je niet meer door de grond.Voeg hieronder een Speed Vertical-actie toe (tab: move). Typ bij vert. speed de waarde
0
. Het venster ziet er nu zo uit. - Voeg een Collision-event toe met obj_platform. Voeg vervolgens een Set Variable-actie toe (tab: control). Bij variable typ je
x
en bij value typ jexprevious
. De x-coördinaat wordt ingesteld op de vorige x-coördinaat. Het venster ziet er nu zo uit. - Voeg hieronder een Set Variable-actie toe (tab: control). Bij variable typ je
y
en bij value typ jeyprevious
. De y-coördinaat wordt ingesteld op de vorige y-coördinaat. Het venster ziet er nu zo uit. - Voeg hieronder een Move to Contact-actie toe (tab: move). Bij direction typ je
direction
, maximum laat je staan op-1
en bij against selecteer jeall objects
. Je beweegt nu naar het botspunt (collisionpoint). Het venster ziet er nu zo uit. - Je kunt nu niet meer door buizen en stenen heenlopen. Probeer trouwens eens te bukken. Dat werkt namelijk al.Voeg hieronder een Speed Horizontal-actie toe (tab: move). Typ bij hor. speed de waarde
0
. Het venster ziet er nu zo uit. - Voeg een Keyboard Up-event toe. Voeg vervolgens een Vertical Speed-actie toe (tab: move). Bij vert. speed typ je
-18
. We kunnen nu springen! Het venster ziet er nu zo uit. - Voeg hieronder een Play Sound-actie toe (tab: main1). Bij sound kies je
snd_jump
. Loop laat je staan opfalse
. Het venster ziet er nu zo uit. - Voeg hieronder een Change Instance-actie toe (tab: main1). Bij change into kies je
obj_mario_air
. Bij perform events selecteer jeyes
. We veranderen nu van toestand. Het venster ziet er nu zo uit. - Voeg een Step, End Step-event toe. Voeg vervolgens een Check Object-actie toe (tab: control). Selecteer bij object
obj_platform
, x zet je op0
, y zet je op2
en de vinkjes bij relative en not zet je aan. We controleren op deze manier of er nog steeds grond onder onze voeten is. Het venster ziet er nu zo uit. - Voeg hieronder een Change Instance-actie toe (tab: main1). Bij change into kies je
obj_mario_air
. Bij perform events selecteer jeyes
. We veranderen nu van toestand. Het venster ziet er nu zo uit.
Test nu eens uitgebreid het spel. Als je alles goed hebt gedaan kun je nu springen, vallen, rennen en bukken zonder dat er rare fouten optreden.
Is er iets niet helemaal gelukt? Open dan supermario_final.gmk voor de volledige versie.Samenvatting
Gefeliciteerd, je hebt het laatste hoofdstuk af en Super Mario rent, springt, bukt en valt. Allemaal dankzij zwaartekracht en verschillende mario-objecten.
De belangrijkste afbeelding van dit hoofdstuk is afbeelding 5, waarin je een toestandsdiagram ziet van Mario. Kijk nog eens in Game Maker of je kunt vinden waar alle toestandveranderingen zijn geprogrammeerd.
Het werken met verschillende toestanden maakt het programmeren overzichtelijker. Je voorkomt dat je eindigt met één enorm moeilijk mario-object. In plaats daarvan laat je verschillende kleinere objecten samenwerken om een moeilijk spel te maken.
Je hebt voor het eerst kennisgemaakt met een view. Je hebt zelf niets in hoeven stellen, maar onthoud in ieder geval dat Game Maker de mogelijkheid biedt om eenvoudig met views te werken. Eigenlijk staat in afbeelding 2 alles wat je moet weten om een view in te stellen.
Overerving is een sterk mechanisme om je veel werk uit handen te nemen. De buizen, stenen en grond zijn allemaal kind-objecten van obj_platform. Botsingen tussen Mario en obj_platform zorgen er mede voor dat we niet door de grond heen zakken.
Extra's
Helaas, helaas. Je hebt niet heel Super Mario nagemaakt. Daar gaat natuurlijk iets meer tijd in zitten. Je hebt zelf vast wel wat ideeën om het spel uit te breiden. Je kunt ook in het lijstje hieronder kijken.
- Pas het level aan of maak een nieuwe levels.
- Vind je dat Mario te snel loopt of te hoog springt? Probeer dat eens aan te passen.
- Er staan een aantal groene buizen in het level. Het is wel leuk als je daar ook echt in kan.
- De echte Mario kan schieten nadat hij een bloem heeft gepakt.
- Wellicht kun je een obj_mario_climb maken zodat Mario ergens op kan klimmen.
- Mario is nu standaard de grote Mario. Kun je Mario klein maken en pas vergroten wanneer hij een rode paddestoel pakt?
Extra sprites vind je gemakkelijk op Yoyogames onder Resources.