1. Pac-Man, alle munten verzamelen!

Pac-Man is een van de bekendste spellen ter wereld. In het spel bestuur je het welbekende gele "happertje". Het is jouw doel om alle muntjes op te eten. Ondertussen zijn er 4 monsters, ook wel spookjes genoemd, die Pac-Man proberen te pakken. Deze spookjes zijn alle vier op een andere manier geprogrammeerd en proberen Pac-Man op een eigen manier te pakken te krijgen. Door een speciaal muntje te pakken worden de monstertjes tijdelijk bang. Je hebt dan een paar tellen de tijd om ze op te eten.

Sinds 1980 verovert Pac-Man de wereld en nog steeds wordt het spel gespeeld. Meer lezen over Pac-Man doe je op de (engelstalige) Wikipedia.

2. Leerdoelen: wat kun je na deze oefening?

Je kunt na het maken van Pac-Man in eigen woorden uitleggen hoe je recursie kunt toepassen in een spel. Je gaat ook gebruik maken van het Step-event. Je kunt dit event gebruiken om objecten slim te laten bewegen. Je kunt dan ook de variabelen x en y van een object gebruiken. Daarnaast leer je gebruik te maken van kansen. Je kunt kansen zelf toepassen in een spel.

3. Eerste versie testen

Download het zip-bestand (pacman.zip) met daarin alle bestanden die je nodig hebt om Pac-Man te maken.

In de eerste versie (pacman1.gmk) bewegen de monsters nog niet. Dat ga je straks zelf namelijk programmeren. De besturing van Pac-Man is al wel gemaakt. De belangrijkste zaken die al gedaan zijn, lees je hieronder.

Pac-Man

Net zoals bij Sokoban is er in dit spel weer gebruik gemaakt van overerving. Dit is gedaan om op een handige manier de botsing tussen Pac-Man en de monsters te programmeren. In afbeelding 1 zie je de botsing tussen obj_pacman en obj_monster.

Object Pacman: botsing met parent obj_monster.Afbeelding 1. Object Pacman: botsing met parent obj_monster.

De startpositie is de plaats van een object bij de start van een level.

Als de monsters niet bang zijn (variabele scared is 0), dan verliezen we een leven en keren we terug naar onze startpositie in het spel. Ook alle monsters gaan terug naar de startpositie. Als de monsters bang zijn (else), wordt het monster verwijderd en verdienen we 10 punten extra.

De besturing van Pac-Man (zie afbeelding 2) gaat op de bekende manier. We lopen weer over het grid, net zoals bij Sokoban.

Object Pacman: naar links lopen over het grid.Afbeelding 2. Object Pacman: naar links lopen over het grid.

In totaal zijn er dus 20 verschillende Pac-Man afbeeldingen getekend.

Er zijn 5 verschillende sprites voor Pac-Man, elk bestaande uit 4 subimages. De subimages worden in dit geval gebruikt voor het animeren van Pac-Man. Tijdens het lopen zie je Pac-Man dan ook happen naar de muntjes. In afbeelding 3 zie je de subimages van spr_pacman_left. Als je goed kijkt, zie je dat elk plaatje anders is. De plaatjes worden snel achter elkaar afgespeeld en dat zorgt voor de animatie.

Sprite Pacman Left: meerdere subimages maken een animatieAfbeelding 3. Sprite Pacman Left: meerdere subimages maken een animatie

De regelaar: obj_controller

Het object obj_controller regelt drie belangrijke dingen in het spel:

Het is van belang dat obj_controller altijd in de room staat. Zie afbeelding 4.

Zet obj_controller altijd in een leeg hokje ergens in de kamerAfbeelding 4. Zet obj_controller altijd in een leeg hokje ergens in de kamer

Automatisch muntjes in het spel

In de kamer (afbeelding 4) zie je nergens muntjes. Toch is heel het level vol met muntjes wanneer je het spel opstart. Hoe dat werkt wordt hieronder uitgelegd. Bekijk eerst afbeelding 5, daarin zie je obj_coin.

Dit ziet er ingewikkeld uit: obj_coin en het Create-event.Afbeelding 5. Dit ziet er ingewikkeld uit: obj_coin en het Create-event.

Een eerste instantie van obj_coin wordt aangemaakt door obj_controller op dezelfde plek als obj_controller. Dus linksbovenin wordt in dit geval (zie afbeelding 4) één muntje neergezet.

Op het moment dat dit muntje wordt aangemaakt, wordt razendsnel het Create-Event van obj_coin uitgevoerd. Alle acties aan de rechterkant in afbeelding 5 worden dan dus uitgevoerd. Hier wordt 4 keer geprobeerd om een nieuw muntje aan te maken: in het hokje rechts, links, boven en onder ten opzichte van het muntje. Zie de animatie hieronder (afbeelding 6).

Het op deze manier aanmaken van muntjes is een voorbeeld van recursie. Recursie houdt in dat een instantie van een object een nieuwe instantie van zichzelf maakt.

Een animatie van hoe de muntjes worden gemaakt.Afbeelding 6. Een animatie van hoe de muntjes worden gemaakt.

Elke keer worden dus de acties van Create-Event van een nieuw muntje uitgevoerd. In het spel zie je dit niet, want dit gebeurt met het laden van de kamer.

4. Zelf bouwen

Het is erg ingewikkeld om de vier originele vijanden van Pac-Man precies hetzelfde te programmeren. Dat ga je dus ook niet doen. Je gaat wel op een andere manier de monsters hun eigen intelligentie geven.

Sla nu eerst het spel op. Ga naar File » Save As en sla het bestand om onder de naam mijn_pacman.gmk.

Monster 1: Blinky

Blinky is niet erg slim. Dit monster kiest een beginrichting (links,rechts,boven,onder) en als hij botst met een muur loopt hij weer terug naar waar hij vandaan kwam.

Monster 1 bestaat al. Dit is namelijk obj_monster1. Open het object (dubbelklikken) en volg de stappen hieronder.

  1. action_move1Voeg een Create-event toe. Voeg vervolgens een Move Fixed-actie toe (tab: move). Kies als direction de pijltjes naar links, rechts, boven en beneden en typ by speed 4. Het venster ziet er nu zo uit.
  2. action_bounceVoeg een Collision-event toe met obj_wall. Voeg vervolgens een Bounce-actie toe (tab: move). Laat alle instellingen zoals ze zijn en klik op OK. Het monster loopt nu niet door de muren heen, maar kaatst terug. Het venster ziet er nu zo uit.

Blinky is nu af. Hij doet precies wat we willen. Start het spel en je ziet nu het rode blokje (obj_monster1) bewegen.

Monster 2: Pinky

Pinky kan precies één pad onthouden door het doolhof. Hij loopt dan ook heel de tijd dezelfde route door het doolhof.

Dit is compleet nieuw voor je. Let extra goed op de omschrijvingen en plaatjes.

Je gaat nu eerst een path maken. Klik op het icoontje om een nieuw path te maken. Zie afbeelding 8.

Een nieuw path makenAfbeelding 8. Een nieuw path maken

In het nieuwe venster (Path Properties) vul je bij Name in path_monster2. Vervolgens selecteer je rechtsbovenin level1. Zie afbeelding 9.

Een path een naam geven en de room instellen als achtergrond.Afbeelding 9. Een path een naam geven en de room instellen als achtergrond.

Je hebt nu een zelfde venster als in afbeelding 10.

De room zie je nu op de achtergrond.Afbeelding 10. De room zie je nu op de achtergrond.

Foutje gemaakt in de route? Links in het scherm staat delete om een punt te verwijderen uit de route.

Door met je muis in de hokjes te klikken kunnen we lijnen maken. Die lijnen vormen samen de route die het monster loopt. Maak een route die begint bij het blauwe monster en daar ook weer eindigt. Op die manier kan de route steeds herhaald worden. Zie afbeelding 11.

Een route gemaakt die begint en eindigt op dezelfde plek.Afbeelding 11. Een route gemaakt die begint en eindigt op dezelfde plek.

Open nu het object obj_monster2 en volg onderstaande stap.

  1. action_pathVoeg een Create-event toe. Voeg vervolgens een Set Path-actie toe (tab: move). Kies als path path_monster2, stel speed in op 4, bij at end selecteer je continue from here en relative laat je staan op relative. Het venster ziet er nu zo uit.

Dat was het al! Het werken met een path is eigenlijk erg eenvoudig. Het maken van een goede route is even wat werk, maar daarna is het snel toegevoegd aan een object.

Is het bovenstaande niet gelukt? Geen zorgen. Open dan pacman2.gmk om verder te gaan.

Monster 3: Inky

Inky is een monster dat al wat slimmer kan bewegen. Hij loopt netjes door de gangen, maar probeert af en toe een zijgang in te slaan. Dit doet hij op willekeurige momenten. Op deze manier zal dit monster overal in het level kunnen komen!

Open nu het object obj_monster3 en volg onderstaande stappen.

Een richting is voor Game Maker een getal tussen de 0 en 360. Daar kunnen we dus mee rekenen.

Rechts = 0
Boven = 90
Links = 180
Beneden = 270
  1. action_move1Voeg een Create-event toe. Voeg vervolgens een Move Fixed-actie toe (tab: move). Kies als direction de pijltjes naar links, rechts, boven en beneden en typ by speed 4. Het venster ziet er nu zo uit.
  2. action_move2Voeg een Collision-event toe met obj_wall. Voeg vervolgens een Move Free-actie toe (tab: move). Bij direction typ je direction+90 We gaan proberen onze richting met 90 te verhogen. Het venster ziet er nu zo uit.
  3. action_iffreeVoeg een Check Empty-actie toe (tab: control). Bij x typ je hspeed en bij y typ je vspeed. Zet ook het vinkje aan bij relative. Op deze manier controleer je of er in de nieuwe looprichting een muur staat. Het venster ziet er nu zo uit.
  4. action_exitVoeg een Exit Event-actie toe (tab: control). Deze actie zorgt ervoor dat we niet de nieuwe richting oplopen. Het venster ziet er nu zo uit.
  5. action_move2Voeg een Move Free-actie toe (tab: move). Bij direction typ je direction+180 We gaan proberen onze richting met 180 te verhogen. Het venster ziet er nu zo uit.
  6. action_iffreeVoeg een Check Empty-actie toe (tab: control). Bij x typ je hspeed en bij y typ je vspeed. Zet ook het vinkje aan bij relative. Op deze manier controleer je of er in de nieuwe looprichting een muur staat. Het venster ziet er nu zo uit.
  7. action_exitVoeg een Exit Event-actie toe (tab: control). Deze actie zorgt ervoor dat we niet de nieuwe richting oplopen. Het venster ziet er nu zo uit.
  8. action_move2Voeg een Move Free-actie toe (tab: move). Bij direction typ je direction+270 We gaan proberen onze richting met 270 te verhogen. Het venster ziet er nu zo uit.

We hebben in de stappen hierboven geprobeerd om een "andere kant" op te bewegen wanneer we botsen met een muur. Het resultaat zie je in afbeelding 20. Start het spel en let op het groene monster. Op dit moment loopt hij nog niet zomaar een willekeurige gang in. Dat komt in de stappen hierna.

We lopen op deze manier altijd een andere kant op als we botsen met een muurAfbeelding 20. We lopen op deze manier altijd een andere kant op als we botsen met een muur

In de stappen hieronder gaan we Inky nog een beetje slimmer maken, zodat hij willekeurig gangen inloopt. Open weer obj_monster3 en volg de stappen.

  1. action_ifgridVoeg een Step, Step-event toe. Voeg vervolgens een Check Grid-actie toe (tab: control). Bij snap hor typ je 32 en bij snap ver typ je 32. Het venster ziet er nu zo uit.
  2. Een dobbelsteen in het Step-event. Belangrijk om te weten is dat dit event 30 keer per seconde wordt uitgevoerd. Er wordt in 1 seconde dus ook 30 keer gedobbeld met een kans van 1 op 8.
    action_ifdiceVoeg een Test Chance-actie toe (tab: control). Bij sides typ je 8. Nu wordt er een dobbelsteen met 8 zijden gegooid. De volgende actie wordt dus met een kans van 1 op 8 uitgevoerd. Het venster ziet er nu zo uit.
  3. action_move1Voeg een Move Fixed-actie toe (tab: move). Kies als direction de pijltjes naar links, rechts, boven en beneden en typ by speed 4. Met een kans van 1 op 8 kiezen we nu één van de vier richtingen. Het venster ziet er nu zo uit.

Inky is nu klaar. Je hebt een monster gemaakt dat willekeurig gangetjes inloopt. Test het spel en let met name op het groene monster. Wil je dat het groene monster sneller van richting probeert te veranderen? Maak dan bij de dobbelsteen van de 8 bijvoorbeeld een 4.

Is het bovenstaande niet gelukt? Geen zorgen. Open dan pacman3.gmk om verder te gaan.

Monster 4: Clyde

Inmiddels bewegen er 3 monsters door de kamer. De laatste wordt uiteraard het slimst, maar is ook het moeilijkst om te programmeren.

Clyde beweegt naar Pac-Man toe. Dit probeert hij zo snel mogelijk te doen. Aan de hand van de positie van Pac-Man kiest hij welke kant hij op beweegt.

Open nu het object obj_monster4 en volg onderstaande stappen.

  1. action_move1Voeg een Create-event toe. Voeg vervolgens een Move Fixed-actie toe (tab: move). Kies als direction de pijltjes naar links, rechts, boven en beneden en typ by speed 4. Het venster ziet er nu zo uit.
  2. action_move1Voeg een Collision-event toe met obj_wall. Voeg vervolgens een Move Fixed-actie toe (tab: move). Kies als direction het vierkantje in het midden. Laat speed op 0 staan. Op deze manier stoppen we met lopen als we tegen een muur aankomen. Het venster ziet er nu zo uit.

Dit was nog niet zo moeilijk. Het lastige gedeelte zit in het Step-Event. Hieronder zie je dit volledige Step-Event van Clyde (afbeelding 26).

Een Step-Event met heel veel (bijna dezelfde) acties!Afbeelding 26. Een Step-Event met heel veel (bijna dezelfde) acties!

Je mag de dobbelsteen ook weglaten. Het monster weet Pac-Man dan nog sneller te pakken!

Aan de hand van de x-coördinaat en y-coördinaat van obj_pacman bepalen we welke richting Clyde op gaat lopen. De dobbelsteen is toegevoegd om het monster iets dommer te maken. De kans bestaat nu namelijk dat Clyde een foutje maakt en niet direct de juiste gang kiest.

Probeer nu zelf het Step-Event te maken aan de hand van de afbeelding hieronder. In afbeelding 27 zitten voldoende aanwijzingen om alles goed in te stellen.

Probeer deze acties na te maken in het Step-Event van obj_monster4Afbeelding 27. Probeer deze acties na te maken in het Step-Event van obj_monster4

Is het bovenstaande niet gelukt? Geen zorgen. Open dan pacman4.gmk om verder te gaan.

De juiste sprites instellen

Allemaal gelukt? Dan is het nu tijd om de juiste plaatjes in te laden. Het spel werkt nu namelijk wel, maar ziet er natuurlijk nog niet mooi uit. In de map met oefenbestanden vind je de map "sprites". Probeer alle afbeeldingen die je daar ziet in het spel te krijgen. Zie afbeelding 28.

Stel de juiste sprites in. Zie je dat ook zonder mooie plaatjes het spel werkt?Afbeelding 28. Stel de juiste sprites in. Zie je dat ook zonder mooie plaatjes het spel werkt?

Is er iets niet helemaal gelukt? Open dan pacman_final.gmk voor de volledige versie.

5. Samenvatting

Je bent klaar! Gefeliciteerd! Je hebt zelf Pac-Man nagemaakt in Game Maker. Hieronder staan nog even de belangrijkste leerpunten.

Alle muntjes in het spel worden automatisch aangemaakt. Probeer te onthouden dat dit gaat door middel van recursie. Dit is een slimme programmeertechniek waarin een object zichzelf aanmaakt. Zie afbeelding 6.

Verder heb je uitgebreid met het Step-Event gewerkt. Alle acties in deze gebeurtenis worden 30 keer per seconde uitgevoerd. Het Step-Event is dus eigenlijk één grote herhaling van acties. Door slim gebruik te maken van de coördinaten van een object kun je bovendien écht slimme objecten programmeren.

Verder heb je in deze oefening gebruik gemaakt van de dobbelsteen. Je kunt hiermee acties uitvoeren met een bepaalde kans. Als de dobbelsteen 2 zijden heeft, betekent dit dat de onderstaande actie met een kans van 50% wordt uitgevoerd; de ene keer wel, de andere keer niet. Hiermee kun je het spel een stuk onvoorspelbaarder maken!

6. Extra's

Wist je dat de oorspronkelijke Pac-Man meer dan 200 levels had? Nu is het wel wat veel gevraagd om er zo veel te maken, maar probeer zelf eens een paar levels toe te voegen.

Wil je iets uitdagenders proberen? Probeer dan eens om nog een monster te maken. Dit monster laat je natuurlijk wel op een andere, slimme manier lopen!