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.

Mapjes in mapjes. Met je rechtermuisknop kun je zelf groups aanmaken.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.

Met een view kun je een grote kamer toch klein weergeven.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.

Zou je dit ook kunnen doen zonder de variabele used? Wellicht krijg je een idee na het lezen van het onderstaande stukje over Koopa.

Als je er tegen aanspringt, wordt used op 1 gezet.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.

De verschillende toestanden van Koopa.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?

Schematische weergave van de verschillende toestandsovergangen.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.

  1. action_gravityVoeg aan het Create-event een Set Gravity-actie toe (tab: move). Typ bij direction 270 en bij gravity de waarde 1.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

De botsing tussen obj_mario_air en obj_platform.Afbeelding 7. De botsing tussen obj_mario_air en obj_platform.

Pas op voor kleine foutjes!

Gebruik deze afbeelding om de acties uit afbeelding 7 toe te voegen.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.

  1. action_gravityVoeg aan het Create-event een Set Gravity-actie toe (tab: move). Typ bij direction 270 en bij gravity de waarde 0. Nu valt Mario niet meer naar beneden. Het venster ziet er nu zo uit.
  2. Als je nu het spel start, val je niet meer door de grond.
    action_vspeedVoeg hieronder een Speed Vertical-actie toe (tab: move). Typ bij vert. speed de waarde 0. Het venster ziet er nu zo uit.
  3. action_variableVoeg 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 je xprevious. De x-coördinaat wordt ingesteld op de vorige x-coördinaat. Het venster ziet er nu zo uit.
  4. action_variableVoeg hieronder een Set Variable-actie toe (tab: control). Bij variable typ je y en bij value typ je yprevious. De y-coördinaat wordt ingesteld op de vorige y-coördinaat. Het venster ziet er nu zo uit.
  5. action_contactVoeg hieronder een Move to Contact-actie toe (tab: move). Bij direction typ je direction, maximum laat je staan op -1 en bij against selecteer je all objects. Je beweegt nu naar het botspunt (collisionpoint). Het venster ziet er nu zo uit.
  6. Je kunt nu niet meer door buizen en stenen heenlopen. Probeer trouwens eens te bukken. Dat werkt namelijk al.
    action_hspeedVoeg hieronder een Speed Horizontal-actie toe (tab: move). Typ bij hor. speed de waarde 0. Het venster ziet er nu zo uit.
  7. action_vspeedVoeg 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.
  8. action_soundVoeg hieronder een Play Sound-actie toe (tab: main1). Bij sound kies je snd_jump. Loop laat je staan op false. Het venster ziet er nu zo uit.
  9. action_changeVoeg hieronder een Change Instance-actie toe (tab: main1). Bij change into kies je obj_mario_air. Bij perform events selecteer je yes. We veranderen nu van toestand. Het venster ziet er nu zo uit.
  10. action_ifobjectVoeg een Step, End Step-event toe. Voeg vervolgens een Check Object-actie toe (tab: control). Selecteer bij object obj_platform, x zet je op 0, y zet je op 2 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.
  11. action_changeVoeg hieronder een Change Instance-actie toe (tab: main1). Bij change into kies je obj_mario_air. Bij perform events selecteer je yes. 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.

Extra sprites vind je gemakkelijk op Yoyogames onder Resources.