De opdracht in het kort is: Maak in groepjes van twee je eigen spel in JavaScript. Je gebruikt de startcode en maakt gebruik van de p5js-library. Om jezelf hierop voor te bereiden doe je eerst deel 1 van de opdracht.
Je schrijft je in via GitHub Classroom via de onderstaande link (login met je github account). Letop: De teamnaam die je kiest bevat de namen van alle leerlingen in je team, bijvoorbeeld jolanda-klaas
Nadat je jezelf helemaal ingeschreven hebt, krijg je automatisch toegang tot een repository met startcode. Er is één repository per team. Elk teamlid heeft lees- en schrijfrechten in de repository.
In dit eerste deel van het PO leren jullie samenwerken aan code en ontwerpen jullie jullie eigen game.
Programmeurs werken bijna nooit alleen. In echte softwareprojecten werken meerdere programmeurs tegelijk aan dezelfde code. Daarom gebruiken we een systeem zoals Git om veranderingen bij te houden en samen te werken.
Deel 1 bestaat uit twee onderdelen.
Git-oefening
Eerst maken jullie een korte oefening waarin jullie leren samenwerken met Git.
Jullie werken per twee leerlingen in dezelfde repository maar ieder op een eigen computer.
Deze oefening is belangrijk, omdat jullie Git ook gebruiken tijdens het maken van jullie game, en dat in team werken aan dezelde code soms problemen kan opleveren.
Na de Git-oefening beginnen jullie met het ontwerpen van jullie eigen game.
Je bent vrij om zelf te kiezen welke game je gaat maken. Je docent moet de game die je kiest goedkeuren. Enkele voorbeelden van een game die je kunt maken zijn: Tennis, Flappy Bird, Snake (voorganger van Slither.io), een Break Out Game (zoals Arkanoid), een race spelletje, een eenvoudige platform game (zoals pacman), een puzzelspel enzovoort.
Jullie bepalen samen:
of het spel singleplayer of multiplayer (2 spelers) wordt
Je maakt deze opdracht in een team van twee personen. De docent geeft aan hoe de teams gemaakt worden. Je bepaalt zelf hoe je het werk binnen je team verdeelt, zolang iedereen een gelijkwaardige bijdrage levert.
Je krijgt van de docent startcode voor deze opdracht. Deze staat klaar in een repo op GitHub. Er is één repo per team.
Het cijfer dat je voor je PO krijgt wordt vanuit verschillende invalshoeken bepaald:
Minimale eisen
Voordat je een cijfer krijgt voor je PO, wordt gekeken of je werk voldoet aan de minimale eisen. Werk dat niet voldoet aan de minimale eisen krijgt het cijfer 1,0. De minimale eisen zijn:
De inhoud is moreel verantwoord: het is niet beledigend, visueel gewelddadig of op andere manieren onfatsoenlijk.
Natuurlijk mag je overleggen met klasgenoten en mag je op internet kijken hoe je bepaalde dingen kunt maken. Let wel op dat je geen plagiaat pleegt. Je mag maximaal 5 regels code overnemen van andere leerlingen of internet en je schrijft in het commentaar erbij waar je het voorbeeld vandaan hebt. Dat geldt ook voor code die je zelf vertaalt naar het Nederlands. Overtypen van code uit een Youtube-video of een tutorial van internet volgen en dat resultaat inleveren is niet toegestaan.
Je gebruikt de startcode die je krijgt.
Je gebruikt het stappenplan dat bij deze opdracht gegeven is.
Werking en aantrekkelijkheid
Spel start op
Het spel werkt (hoe klein ook)
Behaalde punten zijn zichtbaar bij game-over
Het doel en de bediening van het spel is duidelijk
Aantrekkelijk uiterlijk
Prettige bediening
Eenvoudig om mee te beginnen en moeilijker als je verder komt
Techniek
De code volgt de lijn van het template
De code is netjes en duidelijk leesbaar
De code bevat geen dubbele stukken code
Je hebt de technieken gebruikt die in de programmeerlessen zijn aangeboden.
Je hebt dingen toegevoegd waarvan je zelf hebt uitgezocht hoe ze werken
Proces
Je toont inzet tijdens de lessen
De taakverdeling is duidelijk en alle teamleden dragen in gelijke mate bij.
Het werk is verdeeld over de weken waarin aan de opdracht kon worden gewerkt, dit blijkt onder andere uit de commits in Github.
Extra bepalingen voor je cijfer
Je krijgt één cijfer per team, maar de docent kan daarvan afwijken.
Als de teamleden geen gelijkwaardige bijdrage hebben geleverd, dan kun je een individueel cijfer krijgen. Tip: Zorg dat je een gelijkwaardige bijdrage levert binnen het team.
Als het ingeleverde werk van een hoger niveau is dan wat je begrijpt, dan kan de docent extra vragen stellen over je opdracht en op basis daarvan je cijfer bijstellen. Tip: Zorg dat jij en je teamleden je eigen en elkaars werk begrijpen.
Fraude wordt gemeld aan de examencommissie, daarna bepaalt de examencommissie wat er met je cijfer gebeurt. Tip: Vermeld altijd de bronnen die je gebruikt hebt en zorg dat duidelijk is welk stuk van je werk op welke bron is gebaseerd. Van Youtube video’s of AI-chats kun je de linken bijvoegen.
Gebruik van AI bij het maken van je game:
Je mag AI gebruiken om je te helpen bij het maken van je praktische opdracht, maar er gelden belangrijke voorwaarden:
Je moet alle code die je gebruikt kunnen uitleggen. Tijdens de beoordeling kan ik vragen stellen over jouw bestanden. Kun je het niet uitleggen, dan beschouw ik het als niet-eigen werk en krijg je een 1. Er is geen herkansing voor dit PO.
Je moet kleine aanpassingen in de code snel zelf kunnen uitvoeren. AI mag je ondersteunen, maar jij moet begrijpen wat er gebeurt. Dit wordt getest doormiddel van het vragen om een kleine aanpassing door te voeren.
Gebruik vooral de template die je al gekregen hebt. Laat AI deze template niet volledig aanpassen. Als je de structuur te veel verandert, kan de docent je later niet goed helpen.
Neem slechts kleine stukjes code over. Vraag AI bijvoorbeeld om uitleg, een stukje CSS of een oplossing voor één specifiek probleem. Als je grote blokken code overneemt, is de kans groot dat je het niet begrijpt en dat merk ik direct tijdens de beoordeling.
Kort samengevat: AI is een hulpmiddel, geen vervanging van jouw eigen inzicht. Gebruik het slim, neem kleine stukken over en zorg dat je altijd weet wat je code doet. Succes!
De deadline voor inleveren vind je in de lesplanner.
Je kunt vragen stellen tot de laatste les voor de deadline.
Je zorgt dat alle bestanden in die nodig zijn om je spel te spelen in GitHub staan, dit zijn ten minste: index.html, style.css en script.js. Als je plaatjes gebruikt, dan staan die er ook bij.
Uit de versie historie in GitHub blijkt wanneer je wat gedaan hebt.
De laatste versie van je PO die op het moment van de deadline in GitHub staat, wordt gebruikt voor de beoordeling.
Startcode
Je krijgt van de docent een kopie van onderstaande startcode.
Stappenplan
Werk de planning af van boven naar beneden. Vul de planning aan en stel bij terwijl je aan de opdracht werkt.
De voorbeelden hieronder helpen je op weg. Ze zijn niet compleet. Je moet zelf nadenken over wat er mist of hoe je ze aanpast voor jouw spel.
1. Speler bewegen
Voeg dit toe aan beweegAlles(). De speler beweegt met pijltjestoetsen of WASD. keyIsDown kijkt of een bepaalde toets is ingeduwd. Je kan op
deze site
zien welke toets aan welk nummer is gekopperd.
// beweeg omhoog
if(keyIsDown(UP_ARROW)||keyIsDown(87)){// 87 = W
spelerY=spelerY-5;}// voeg zelf de andere drie richtingen toe
In plaats van altijd 5 te gebruiken kan je hier ook een variabele van maken die je later aanpast om de snelheid aan te kunnen passen van je speler.
Zorg dat de speler niet buiten het scherm kan. Gebruik een && in de if zodat de beweging alleen plaatsvindt als de speler nog binnen de grenzen is.
Wat moet de grenswaarde zijn? De grenzen kan je vinden in createCanvas() daar definieer je hoe groot je speelveld is. Denk ook aan de grootte van de speler en waar die start.
2. Afbeelding gebruiken
Maak een map afbeeldingen/ in je repository en zet daar je plaatje in.
Voeg bovenaan sketch.js een variabele toe:
varspelerAfbeelding;
Laad de afbeelding in preload() (voeg deze functie toe boven setup()). Als je meerdere plaatjes wilt voeg je die allemaal toe in dezelfde preload() functie. Elk plaatje heeft wel zijn eigen variabele nodig.
Het template heeft al SPELEN, GAMEOVER en spelStatus. Voeg een derde toestand toe bovenaan:
constINTRO=0;// nieuw
constSPELEN=1;constGAMEOVER=2;varspelStatus=INTRO;// begin op het startscherm
Vul in draw() de lege blokken in:
if(spelStatus===INTRO){// teken een startscherm
background(0);fill('white');textAlign(CENTER,CENTER);textSize(40);text('???',width/2,height/2-40);textSize(20);text('Druk op SPATIE om te starten',width/2,height/2+20);}if(spelStatus===GAMEOVER){background(0);fill('red');textSize(50);textAlign(CENTER,CENTER);text('GAME OVER',width/2,height/2-40);fill('white');textSize(20);text('Punten: '+???,width/2,height/2+20);text('Druk ENTER om opnieuw te spelen',width/2,height/2+60);}
Verwerk de toetsen in keyPressed():
functionkeyPressed(){if(spelStatus===INTRO&&key===' '){spelStatus=SPELEN;}if(spelStatus===GAMEOVER&&keyCode===ENTER){// reset alle variabelen naar beginwaarden
punten=???;health=???;spelerX=???;spelerY=???;spelStatus=???;}}
Vergeet niet ook de vijanden en kogel te resetten.
5. Vijanden
Gebruik arrays voor de x- en y-posities van alle vijanden. Voeg bovenaan toe:
Beweeg de vijanden in beweegAlles() van de rechterkant van het scherm richting de linkerkant van het scherm. Dit doe je met een loop over alle elementen in de array:
for(vari=0;i<vijandenX.length;i++){vijandenX[i]=vijandenX[i]-vijandenSnelheid;// Als de vijand aan de rand van het scherm is gekomen moet hij terug naar de andere kant
if(vijandenX[i]<???){vijandenX[i]=???;vijandenY[i]=???;}}
Als je vijanden naar je speler toe wilt bewegen kijk dan naar code snippet 8 en pas bovenstaande code daarmee aan.
Teken ze in tekenAlles():
for(vari=0;i<vijandenX.length;i++){???}
6. Botsing (rechthoek)
Twee rechthoeken botsen als ze elkaar overlappen in zowel x- als y-richting. Voeg dit toe aan verwerkBotsing():
De array groeit elke keer als je schiet. Je kan erover nadenken om te checken wanneer een kogel buiten beeld is, en die dan te verwijderen. Zo gaat je spel beter werken.
In welke richting schiet jouw speler? Pas de beweging aan. Vergeet de kogels ook te tekenen in tekenAlles() en botsingen te verwerken in verwerkBotsing().
8. Richting bepalen
Soms wil je iets laten bewegen richting een ander punt. Bijvoorbeeld: een kogel richting de muis, of een vijand richting de speler. Je berekent het verschil in x en y, en schaalt dat bij tot de gewenste snelheid met behulp van de stelling van Pythagoras.
vardx=doelX-beginX;// verschil in x
vardy=doelY-beginY;// verschil in y
varafstand=sqrt(dx*dx+dy*dy);// afstand tussen de twee punten
varsX=dx/afstand*snelheid;// stap in x-richting
varsY=dy/afstand*snelheid;// stap in y-richting
Voor een kogel richting de muis sla je sX en sY op bij het afvuren. Voor vijanden die richting de speler bewegen gebruik je hetzelfde idee in de bestaande loop.
Wat gebeurt er als afstand gelijk is aan 0? Wanneer kan dat voorkomen en hoe voorkom je een fout?