Programmeringsopgave PacMan
IT Camp for piger 2020
Eksempel på ændring i koden / Intro til greenfoot 8
Ekstra opgaver - vælg en af gangen 12
Hints til brug af Pacman og Greenfoot API’en 13
Vil du have en goodiebag? https://forms.gle/oRyLexfynsjzjn1B6 |
Hvis du kører Windows kan Greenfoot anskaffes på følgende måde:
Note: Greenfoot kan også installeres gennem Windows installeren, hvis man ønsker at bruge det i længere tid.
Hvis du kører MacOS kan Greenfoot anskaffes på følgende måde:
Hvis du kører en Linux distribution er der god chance for at du har styr på hvordan man anskaffer greenfoot.
For Ubuntu, Debian og lignende har Greenfoot selv en installationsguide på https://www.greenfoot.org/download/installation
For Archlinux findes AUR pakken greenfoot
For andre distributioner stoler vi på du ved hvad du laver.
For at demonstrere workflowet i Greenfoot laver vi her en ændring i koden. Denne ændring er inkluderet i det downloadede projekt.
Lige nu står spøgelserne helt stille når spillet kører. Vi vil gerne give dem en simpel opførsel hvor
Lad os lave den ændring.
Vi åbner Ghost klassen ved at dobbeltklikke på dens ikon i klassediagrammet
Med dette åbner editoren med Ghost klassen
For at tilføje den ønskede opførsel tilføjer vi et nyt metodekald i act(). act() bliver kaldt hver gang “Act” knappen i Greenfoot vinduet bliver klikket, eller kontinuerligt hvis “Run” knappen er blevet klikket.
Vi tilføjer et kald til act(), kaldet moveRandom()
Greenfoot beklager sig fordi metoden ikke findes, så vi opretter den nedenunder funktionen killPacman()
Vi kan nu begynde at implementere funktionaliteten.
Vi laver i moveRandom() et kald til metoden moveInDirectionIfPossible(), som er defineret i MoveableActor. moveInDirectionIfPossible() tager en parameter som er retningen actoren skal forsøge at bevæge sig i. Siden vi gerne vil bevæge os i den samme retning husker vi dette i en feltvariabel som vi kalder currentDirection
Hvis vi klikker “Run” nu vil alle spøgelserne begynde at bevæge sig mod højre indtil de rammer en mur.
Vi kan nu tilføje den anden del af opførelsen
Hvis spøgelset rammer en mur kan det ikke længere bevæge sig i den retning.
Metoden moveInDirectionIfPossible() returnerer en boolean (true/false) om det lykkedes at bevæge sig. Den kan vi bruge til at vurdere om en ny retning er nødvendig.
Vi opbevarer om bevægelse lykkedes i en lokal boolean variabel
Og vi kan nu tilføje en if sætning
If sætninger fungerer sådan, at hvis indholdet i parenteserne evaluerer til sandt, så bliver koden i tuborg-parentesen kørt. “!” er et udtryk som betyder “ikke”. Altså, hvis det ikke lykkedes at bevæge sig, skal vi køre det indre kode.
Hvis dette sker skal vi sætte en ny tilfældig retning.
Til at vælge en tilfældig retning kan vi bruge Greenfoot.getRandomNumber(int limit), som returnerer et tilfældigt tal fra 0 (inklusiv), op til, men ikke inkluderende limit. Vi vil gerne have en tilfældig retning ud af fire, alle i en 90 graders vinkel. Derfor kan vi skrive:
Hvis vi nu klikker “Run” opfører spøgelserne som forventet. De bevæger sig til de rammer en væg, skifter retning, og bevæger sig så igen.
Lav to-player spil
Lav labyrinten om
Kom lyde på spillet
HINT: Greenfoot har indbygget optager (tools>Show Sound Recorder)
HINT: Greenfoot har en lyd-klasse; GreenfootSound
Få Pacman til at bevæge sig hurtigere end Spøgelserne
Lav noget du selv synes kunne være sjovt! Man kan nærmest lave ALT.
I spillet nedarver Pacman fra MoveableActor. Det betyder at Pacman klassen kan gøre brug af metoder fra MoveableActor. I denne klasse kunne følgende metoder være af interesse:
Metodenavn mm. | Forklaring |
endGameIfDone(); | Tjekker om alle oste er blevet spist eller Pacman ikke længere findes. I så fald viser en passende besked og stopper spillet. |
moveInDirectionIfPossible(UP); | Tjekker om actoren (Pacman eller Ghost) kan bevæge sig i en bestemt retning, og bevæger sig så i den retning hvis det kan lade sig gøre. Returnerer om det lykkedes at bevæge sig. Tager en retning i grader som parameter. Her kan følgende konstanter bruges: |
UP DOWN LEFT RIGHT | Konstanter som beskriver de fire mulige retninger en actor kan bevæge sig i spillet. Kan bruges som parameter, eks: moveInDirectionIfPossible(DOWN); Vinklen de holder er grader i urets retning, startende med pegende mod højre som 0 grader. |
Følgende er nyttige metoder fra de forskellige klasser som Greenfoot tilgængeliggører:
Klassenavn.Metodenavn | Forklaring |
Greenfoot.isKeyDown(“W”); | Tjekker om en bestemt tast på tastaturet er trykket ned. Almindelige bogstaver kan tjekkes med deres bogstav, eg. “S”. Piletaster kan tjekkes med “UP”, “LEFT” osv Eksempel: if (Greenfoot.isKeyDown(“F”)){ // Do thing } |
removeTouching(Cheese.class); | Fjerner alle objekter af en given klasse, som det kaldende objekt berører. Eksempel: removeTouching(Wall.class); //Fjerner alle Wall objekter som den kaldende Actor berører |
isTouching(Cheese.class); | Tjekker om den kaldende Actor berører et objekt af given klasse. Returnerer en boolean (true or false) Eksempel: if (isTouching(Wall.class)){ // Ran into a wall, // play bonk noise. } |
move(1); | Bevæger en actor fremad en bestemt afstand Eksempel: move(2); // Move 2 units forward. |
En klasse som håndterer lyde, og afspilning af lyde. Eksempel: private GreenfootSound wallHitSound = new GreenfootSound("sounds/bonk.mp3"); | |
Afspiller lyden som objektet holder. Eksempel: wallHitSound.play(); |
Hvis du ikke kan finde det du leder efter her, kan den fulde API findes på:
https://www.greenfoot.org/files/javadoc/
♥ IT Camp