10 · Platformspel met zwaartekracht

Je eindproject. Je bouwt het soort spel waar Mario, Sonic en Celeste van gemaakt zijn: een figuur die valt, landt, springt en over platforms loopt. Het bijzondere is dat zwaartekracht in Scratch niet bestaat — je maakt ze zelf, met één variabele en twee blokken. Je bouwt dit in heel kleine stapjes op: eerst vallen, dan landen, dan springen, dan lopen, dan munten, dan een tweede level, en tenslotte een hoogscorelijst. Neem je tijd en test na elke stap.

★★★★ eindproject 28 stappen ongeveer 2 uur

Wat leer je?

  • Waarom zwaartekracht een variabele is en geen blok
  • Het verschil tussen snelheid en positie — de kern van alle spelfysica
  • Botsingen oplossen: uit de grond duwen tot je er net bovenop staat
  • Alleen mogen springen als je echt op de grond staat
  • Een eigen blok maken met parameters (Mijn Blokken)
  • Levels wisselen met achtergronden en een signaal
  • Een lijst gebruiken om meerdere scores te bewaren

Wat heb je nodig?

  • Een nieuw, leeg Scratch-project — en ongeveer twee uur rust
  • Een sprite als Speler, bijvoorbeeld Cat, Avery Walking of Gobo
  • Een lege sprite die je zelf tekent: Grond
  • De sprite Ball of Button2 als Munt
  • De sprite Door (of Arch) als Deur
  • Twee geluidjes, bijvoorbeeld Coin en Boing

Alles uit opdracht 1 tot 9 komt hier samen. Twijfel je over klonen? Kijk nog eens naar opdracht 9.

Stap voor stap

Dit is de langste opdracht van de gids, en de enige regel die echt telt is: test na elke stap. Een platformspel dat je in één keer in elkaar zet, werkt nooit — en dan weet je niet waar het misgaat. Boven elk script staat bij welke sprite het hoort. Vink een stap af als hij klaar is; je browser onthoudt dat.

1

Zet je vier sprites klaar

Uiterlijk

Voeg vier sprites toe en geef ze meteen een nette naam: Speler, Grond, Munt en Deur. De sprite Grond maak je met de knop Teken (het penseeltje in het sprite-menu): je begint dus met een lege tekening.

Waarom is de grond een sprite en niet gewoon de achtergrond? Dit is de belangrijkste beslissing van je hele project. Het blok "raakt ...?" kan alleen naar sprites kijken, nooit naar een achtergrond. Zou je je platforms op de achtergrond tekenen, dan kan je speler er nooit op staan — hij zakt er dwars doorheen. (Er bestaat wel "raakt kleur ...?", maar dat is traag en breekt zodra je ergens dezelfde kleur gebruikt.) Dus: alles waar je op kan staan, hoort in één sprite die Grond heet.
  • Ik heb vier sprites met de juiste namen
2

Teken je level: grond, platforms en een gat

Uiterlijk

Klik de sprite Grond aan en ga naar het tabblad Uiterlijken. Zet linksonder de tekenmodus op Bitmap en teken met de rechthoek (gevuld):

  • Een brede balk helemaal onderaan — dat is je vloer. Laat er in het midden een gat van ongeveer 80 pixels in.
  • Twee of drie kleinere balken erboven, als zwevende platforms. Zorg dat ze te bereiken zijn met een sprong van ongeveer 100 pixels hoog.

Noem dit uiterlijk level1. Sleep daarna de sprite op het speelveld precies op zijn plaats, en zet in het codegebied dit korte startscript.

Sprite: Grond

als wordt aangeklikt
ga naar laag achtergrond
verander uiterlijk naar level1
toon
Alle platforms in één tekening? Ja, en dat is expres. Eén sprite met alle balken erin betekent één keer "raakt Grond?" vragen, hoe ingewikkeld je level ook wordt. Zou je elk platform een eigen sprite geven, dan moest je straks vijf keer "raakt ...?" controleren met een berg of-blokken. Je hele level is nu gewoon een tekening.
  • Mijn level staat op het scherm: een vloer met een gat en enkele platforms
3

Zet de speler klaar

Beweging

Klik de sprite Speler aan. Maak hem klein (een grote sprite past niet tussen je platforms), zet de draaistijl op links-rechts en plaats hem linksboven, in de lucht. Ja, in de lucht — je wil hem zo meteen zien vallen.

Sprite: Speler

als wordt aangeklikt
maak grootte 50 %
zet draaistijl op links-rechts
ga naar x: -200 y: 100
Waarom draaistijl links-rechts? Zonder die instelling gaat je sprite op zijn kop hangen zodra hij naar links kijkt. Met "links-rechts" spiegelt hij netjes, zoals in elk echt platformspel.
  • Mijn speler staat klein en linksboven in de lucht
4

Maak de variabele snelheidY

Variabelen

Maak één variabele: snelheidY, voor alle sprites. Zet ze bij de start op 0. Vink het vakje ernaast even aan zodat je de waarde op je speelveld ziet — je gaat er de komende stappen constant naar kijken.

Sprite: Speler

als wordt aangeklikt
maak grootte 50 %
zet draaistijl op links-rechts
ga naar x: -200 y: 100
maak snelheidY 0
Waarom is zwaartekracht een variabele en geen blok? Zoek gerust in het hele blokkenpalet: er is geen "val naar beneden"-blok, en dat is geen vergetelheid. Zwaartekracht is namelijk geen plaats maar een verandering. Laat een steen vallen: na één seconde valt hij traag, na twee seconden sneller, na drie seconden nog sneller. Zijn snelheid verandert dus voortdurend — en alles wat tijdens het spelen verandert en onthouden moet worden, is in Scratch een variabele. snelheidY is precies dat: het getal dat zegt hoeveel pixels je speler dit moment omhoog (positief) of omlaag (negatief) beweegt.
Snelheid is niet hetzelfde als positie. "y-positie" zegt waar je bent, "snelheidY" zegt hoe hard je beweegt. Dat onderscheid is de kern van bijna alle spelfysica. Springen betekent: zet je snelheid in één klap hoog. Vallen betekent: laat de zwaartekracht die snelheid langzaam naar beneden trekken.
  • De variabele snelheidY staat op mijn speelveld en begint op 0
5

Zwaartekracht: twee blokken, meer niet

Besturing

Sleep een herhaal voortdurend onder je startblokken en zet er precies twee blokken in. Eerst wordt de snelheid één lager, daarna verplaats je de speler met die snelheid. Deze volgorde is belangrijk.

Sprite: Speler

herhaal voortdurend
verander snelheidY met -1
verander y met snelheidY
Reken het even mee. Ronde 1: snelheidY wordt -1, je zakt 1 pixel. Ronde 2: snelheidY wordt -2, je zakt 2 pixels. Ronde 3: -3, dus 3 pixels. Na tien rondes val je al 10 pixels per stap. Precies zoals een echte steen: hoe langer je valt, hoe sneller je gaat. Twee blokken, en je hebt natuurkunde nagebouwd. Kijk naar de teller op je speelveld terwijl je valt — je ziet het getal wegzakken.
Waarom staat "verander snelheidY met -1" in de lus en niet erboven? Omdat het geen instelling is maar een gebeurtenis die elke stap opnieuw plaatsvindt. Zwaartekracht trekt niet één keer — ze trekt onophoudelijk. Zet je dat blok erboven, dan val je eeuwig met exact 1 pixel per stap en voelt je spel als de maan.
  • Mijn speler valt, en steeds sneller

Testmoment — hij valt dwars door de grond (dat hoort nu nog)

controle

Klik op de vlag. Je speler valt, versnelt, en verdwijnt gewoon door de vloer naar beneden tot hij onderaan blijft plakken. Dat is geen fout — dat hoort zo. Je hebt zwaartekracht gebouwd, maar nog geen grond. Controleer voor je verder gaat:

  • Valt hij steeds sneller? Kijk naar de teller: -1, -2, -3, -4 ... Blijft het getal op -1 staan, dan zit "verander snelheidY met -1" buiten de lus.
  • Valt hij helemaal niet? Kijk of "verander y met snelheidY" écht het ronde oranje blokje bevat en niet het getal 0.
  • Gaat hij omhoog? Dan staat er +1 in plaats van -1. Naar beneden is negatief.
  • Springt hij meteen naar de onderrand? Dat is normaal: hij valt zo snel dat je het niet ziet. Zet -1 tijdelijk op -0.3 om het in slow motion te bekijken.
  • Mijn speler valt versnellend door de grond heen
7

Landen: stop met vallen als je de grond raakt

Waarneming

Zet onder je twee zwaartekrachtblokken — nog steeds in de lus — een als-blok dat vraagt of je de Grond raakt. Zo ja: zet de snelheid op 0.

Sprite: Speler

herhaal voortdurend
verander snelheidY met -1
verander y met snelheidY
als raakt Grond ? dan
maak snelheidY 0
Snelheid op 0 zetten = "je bent gestopt". Zonder dit blok blijft snelheidY dalen naar -20, -50, -100, ook al lig je al op de grond — en dan schiet je bij de eerste beweging weer door de vloer. Test het nu: je speler zakt tot in de grond en blijft daar half in steken. Half. Dat lossen we in de volgende stap op.
  • Mijn speler zakt niet meer door de vloer, maar zit er half in
8

Duw hem uit de grond tot hij er net bovenop staat

Besturing

Zet in het als-blok, vóór "maak snelheidY 0", een herhaal tot-lus met de operator niet uit Operatoren. Zolang je nog in de grond zit, ga je één pixel omhoog.

Sprite: Speler

als raakt Grond ? dan
herhaal tot niet raakt Grond ?
verander y met 1
maak snelheidY 0
Wat gebeurt hier precies? Je valt met bijvoorbeeld 9 pixels per stap. Dat betekent dat je nooit exact op de rand van de vloer landt: je springt er 9 pixels in. De herhaal-tot-lus tilt je daarna pixel per pixel omhoog en stopt op het exacte moment dat je de grond net niet meer raakt. Dat gebeurt binnen één beeldje, dus je ziet er niets van — maar zonder deze truc zakt je speler bij elke landing dieper de vloer in.
De operator "niet" draait waar en niet-waar om. "niet (raakt Grond?)" is waar zodra je los bent van de grond. Zonder dat blokje zou je lus meteen stoppen en gebeurde er niets.
  • Mijn speler staat netjes bovenop de vloer

Testmoment — blijft hij rustig staan?

controle

Klik op de vlag en kijk tien seconden naar je speler zonder iets te doen. Hij hoort roerloos op de vloer te staan, met snelheidY die tussen 0 en -1 flikkert. Klopt dat niet?

  • Hij trilt hevig op en neer? Dan staat "maak snelheidY 0" buiten het als-blok, of de herhaal-tot-lus duwt te ver (controleer dat er "verander y met 1" staat en niet 10).
  • Hij zakt langzaam weg? "maak snelheidY 0" ontbreekt of staat op een verkeerde plek.
  • Het spel bevriest volledig? Berucht: je speler is helemaal in de grond terecht­gekomen op een plek waar hij nooit meer los raakt, of "raakt Grond?" is per ongeluk "raakt Speler?". Klik op stop, sleep je speler met de muis naar boven en probeer opnieuw.
  • Hij staat een paar pixels boven de grond te zweven? Dat hoort erbij en is precies wat je wil — onthou dat goed, want in stap 11 blijkt het belangrijk.
  • Test ook of hij op een hoger platform blijft staan: sleep hem er met je muis boven terwijl het spel loopt.
  • Mijn speler staat stabiel op de vloer én op de platforms
10

Springen — de eerste poging

Operatoren

Springen is verrassend simpel: je zet snelheidY in één klap op een groot positief getal, en de zwaartekracht die je al gebouwd hebt doet de rest. Maar je mag alleen springen als je op de grond staat — anders vlieg je. Sleep de operator en uit Operatoren en vul de twee zeshoekjes.

Sprite: Speler — onderaan in de lus

als toets pijltje omhoog ingedrukt? en raakt Grond ? dan
maak snelheidY 14
Waarom "en" en niet twee losse als-blokken? Omdat er allebei aan voldaan moet zijn: je duwt op omhoog én je staat op iets. De operator "en" is alleen waar als beide zeshoekjes waar zijn. Zou je alleen naar de toets kijken, dan kan je middenin de lucht opnieuw springen — en dan blijf je gewoon omhoog vliegen zolang je de toets ingedrukt houdt.
Waarom 14? Dat bepaalt hoe hoog je springt. Bij een zwaartekracht van -1 haal je met 14 ongeveer 100 pixels — net genoeg voor een platform. Kan je je platforms niet halen? Verhoog naar 16 of 18, of leg je platforms wat lager.
  • Het spring-blok staat onderaan in mijn lus

Testmoment — je springt niet. Zoek zelf uit waarom

controle

Klik op de vlag en druk op het pijltje omhoog. Er gebeurt niets, of hooguit heel af en toe een sprongetje. Toch is je blok logisch juist. Denk eerst zelf na voor je verder leest — het antwoord staat in stap 9.

  • Kijk naar je speler terwijl hij "stilstaat". Raakt hij de grond op dát moment?
  • Denk terug aan stap 8: de herhaal-tot-lus duwt hem omhoog tot hij de grond net niet meer raakt. Precies dáár eindigt elke ronde van je lus.
  • Dus op het moment dat jouw als-blok vraagt "raakt Grond?", is het antwoord bijna altijd nee — je zweeft één pixel boven de vloer.
  • Dit is geen tikfout in je script, maar een denkfout in de volgorde. Zulke bugs zijn de moeilijkste én de leerzaamste die er bestaan.

Kon je het zelf vinden? Petje af. Kon je het niet? Ook prima — profs zoeken hier soms een halve dag naar. In de volgende stap los je het op.

  • Ik snap waarom "raakt Grond?" hier bijna altijd nee zegt
12

De tenen-truc: even naar beneden voelen

Beweging

De oplossing is even simpel als slim: zak vlak vóór de vraag twee pixels, stel je vraag, en ga daarna weer twee pixels omhoog. Je voelt met je tenen of er grond onder je zit. Zet dus één blok vóór en één blok ná je als-blok.

Sprite: Speler — het springgedeelte, compleet

verander y met -2
als toets pijltje omhoog ingedrukt? en raakt Grond ? dan
start geluid Boing
maak snelheidY 14
verander y met 2
Waarom werkt dit? Twee pixels naar beneden is genoeg om de grond weer aan te raken als je er echt vlak boven staat — en veel te weinig om iets te raken als je middenin de lucht hangt. Je vraag wordt dus alleen met "ja" beantwoord op het juiste moment. Daarna zet je jezelf netjes terug waar je was, zodat niemand iets merkt. Dit heet in de spelwereld een ground check, en het zit letterlijk in élk platformspel dat ooit gemaakt is.
Vergeet het tweede blok niet! Laat je "verander y met 2" weg, dan zak je elke ronde van de lus 2 pixels — dertig keer per seconde. Je speler zinkt dan langzaam maar zeker door de wereld.
  • Ik spring, en alleen als ik op de grond sta
13

Links en rechts lopen

Beweging

Horizontaal bewegen staat helemaal los van je zwaartekracht: geen snelheid, geen versnelling, gewoon x veranderen zolang je een toets indrukt. Zet deze twee als-blokken onderaan in dezelfde lus. Met "richt naar ... graden" draait je sprite meteen de goede kant op.

Sprite: Speler — onderaan in de lus

als toets pijltje rechts ingedrukt? dan
richt naar 90 graden
verander x met 5
als toets pijltje links ingedrukt? dan
richt naar -90 graden
verander x met -5
Waarom geen snelheidX? Dat zou kunnen — dan krijg je een speler die uitglijdt en nagliedt, zoals Sonic. Maar in de meeste platformspellen wil je juist strakke besturing: los je de toets, dan sta je stil. Daarom is links-rechts hier gewoon "verander x met 5" en heb je alleen voor de verticale as een variabele nodig.
  • Ik loop naar links en rechts en kijk de goede kant op
14

Muren die je tegenhouden

Waarneming

Loop je nu tegen de zijkant van een platform, dan stap je er dwars doorheen. De oplossing is verbluffend eenvoudig: doe de stap ongedaan als je na het bewegen in de grond staat. Zet dus in elk van je twee loop-blokken een extra als-blok.

Sprite: Speler

als toets pijltje rechts ingedrukt? dan
richt naar 90 graden
verander x met 5
als raakt Grond ? dan
verander x met -5
Probeer eerst, maak dan ongedaan. Dat is een echte programmeurstruc: het is vaak veel makkelijker om iets te doen en daarna te kijken of het mocht, dan om vooraf te berekenen of het mag. Bij het pijltje links doe je hetzelfde, maar dan met -5 en +5.
Waarom werkt dit ook als je op de grond staat? Omdat je speler dankzij stap 8 altijd één pixel boven de vloer zweeft. "raakt Grond?" is dus alleen waar als je echt tegen een muur of tegen de zijkant van een platform aan loopt. Alles hangt hier aan elkaar — verander je iets in stap 8, dan breekt dit mee.
  • Ik loop niet meer door platforms heen

Testmoment — voelt het als een echt platformspel?

controle

Dit is het grote moment. Loop je level rond, spring op elk platform, loop tegen elke muur. Neem hier rustig vijf minuten voor. Controleer:

  • Kan je vanaf de vloer op je laagste platform springen? Zo niet: sprongkracht van 14 naar 17, of je platform lager tekenen.
  • Kan je in de lucht nog eens springen? Dan mist de tenen-truc, of je "en"-operator zit niet goed in elkaar (kijk of het echt één zeshoekje mét twee zeshoekjes erin is).
  • Blijf je haken aan de rand van een platform? Normaal bij bitmap-tekeningen met rafelige randen. Teken je balken opnieuw met de rechthoek, of maak je speler iets kleiner.
  • Loop je door een muur heen als je heel snel drukt? Verlaag je loopsnelheid van 5 naar 4.
  • Schiet je door het plafond van een platform als je eronder springt? Bekende beperking van deze eenvoudige aanpak: de uitduw-lus duwt altijd omhoog. Zorg dat je platforms dun zijn, of leef ermee — bij veel schoolprojecten is dit prima.
  • Val je door het gat in je vloer? Ja? Perfect, dat lossen we in de volgende stap op.
  • Lopen, springen en landen voelen goed aan
16

In het gat gevallen? Terug naar de start

Besturing

Zet onderaan in je lus een als-blok dat kijkt of je onder het scherm gezakt bent. Zo ja: terug naar het begin, snelheid weer op 0, en vijf punten aftrek. Maak eerst nog de variabele score (voor alle sprites) en zet die bij de start op 0.

Sprite: Speler — onderaan in de lus

als y-positie < -170 dan
verander score met -5
ga naar x: -200 y: 100
maak snelheidY 0
Waarom moet snelheidY hier terug op 0? Op het moment dat je in het gat valt, is je snelheid al -20 of erger. Zet je die niet terug, dan verschijn je bovenaan en schiet je meteen keihard weer naar beneden, dwars door je vloer. Dit is de tweede keer dat je dezelfde twee blokken nodig hebt — onthou dat even, dat wordt de volgende stap.
  • Val ik in het gat, dan sta ik weer bij de start
17

Maak je eigen blok: "reset speler" met twee parameters

Mijn Blokken

Je hebt nu op drie plekken bijna dezelfde blokken nodig: bij de start, bij het gat, en straks bij level 2. Tijd voor een eigen blok. Klik links onderaan op de roze categorie Mijn Blokken en dan op Maak een blok. Typ als naam reset speler, klik twee keer op Voeg invoer toe (getal of tekst) en noem ze startX en startY. Klik op OK.

Sprite: Speler — de definitie, een los script

definieer reset speler startX startY
ga naar x: startX y: startY
maak snelheidY 0
richt naar 90 graden
maak grootte 50 %
toon
Wat is een parameter? De twee ronde blokjes startX en startY in je hoedblok zijn geen variabelen, maar lege plekken in je eigen blok. Sleep ze vanuit het hoedblok naar binnen in de blokken eronder. Elke keer dat je "reset speler" gebruikt, vul je twee getallen in en die komen dan op die lege plekken terecht. Zo heb je één blok dat je op tien verschillende plekken kan neerzetten met tien verschillende startpunten.
Waarom is dit slim? Wil je later dat je speler bij een reset ook een geluidje maakt, of even onzichtbaar wordt? Dan pas je het op één plek aan in plaats van op drie. Dat is precies waarom programmeurs eigen blokken maken: één idee, één plaats, één naam.
  • Mijn roze blok "reset speler" bestaat en heeft twee invoervakjes
18

Gebruik "reset speler" overal

Mijn Blokken

Je nieuwe roze blok staat nu onderaan in het palet van Mijn Blokken. Vervang er je losse blokken mee: één keer bij de start, één keer in het gat-blok.

Sprite: Speler — de startblokken

als wordt aangeklikt
maak score 0
maak level 1
zet draaistijl op links-rechts
reset speler -200 100

Sprite: Speler — in het gat-blok

als y-positie < -170 dan
verander score met -5
reset speler -200 100
Maak meteen ook de variabele "level" (voor alle sprites) en zet ze bij de start op 1. Die heb je in stap 24 nodig om te weten of je na de deur naar level 2 gaat of het spel wint.
  • Overal waar ik mijn speler terugzet, gebruik ik nu mijn eigen blok

Testmoment — spring bewust in het gat

controle

Klik op de vlag, loop naar het gat en spring erin. Je hoort meteen weer linksboven te verschijnen, rustig te vallen en netjes te landen — en je score staat op -5. Doe dat drie keer na elkaar. Klopt er iets niet?

  • Je schiet na het terugzetten meteen weer door de vloer? Je definitie mist "maak snelheidY 0".
  • Je blijft eeuwig onder het scherm hangen? De grens -170 is te laag voor jouw level. Probeer -160. Onthou: het speelveld eindigt op -180.
  • Je score gaat met -10 of -25 tegelijk omlaag? Je zakt meerdere rondes lang onder -170 voor je teruggezet wordt. Zet "reset speler" als eerste blok in het als-blok.
  • Je roze blok doet niets? Kijk of de definitie een los script is met het hoedblok "definieer reset speler" erboven, en of je de parameters echt vanuit het hoedblok naar binnen gesleept hebt (niet zelf de getallen ingetypt).
  • Vallen en herstarten werkt betrouwbaar
20

Munten plaatsen met klonen

Besturing

Klik de sprite Munt aan. Maak eerst nog de variabele munten. Verberg het origineel, en maak dan met een herhaal 5 keer-lus vijf klonen op een rij, telkens 80 pixels verder. Zo teken je met code een rij munten in plaats van ze één voor één te slepen.

Sprite: Munt

als wordt aangeklikt
maak grootte 35 %
verberg
maak munten 0
ga naar x: -160 y: -40
herhaal 5 keer
maak kloon van mijzelf
verander x met 80
Waarom klonen en geen vijf sprites? Dezelfde reden als in opdracht 9: je tekent één munt en schrijft één script, en toch liggen er vijf in je level. Wil je er tien? Verander de 5 in 10. Wil je ze hoger? Verander één getal. Met vijf aparte sprites zou je vijf keer alles moeten aanpassen — en vijf keer een fout kunnen maken.
Kloon eerst, verplaats daarna. Een kloon erft de positie van het origineel op het moment dat hij gemaakt wordt. Door na élke kloon 80 op te tellen, komt de volgende automatisch 80 pixels verder. Zweeft er een munt in een muur of in de lucht? Verschuif dan de startpositie of pas de afstand aan tot ze mooi boven je platforms liggen.
  • Er liggen vijf munten in een rij in mijn level
21

Een munt oprapen

Variabelen

Zet een tweede, los script bij de Munt met het hoedblok wanneer ik als kloon start. Elke munt-kloon doet precies één ding: wachten tot de speler hem aanraakt, punten geven en zichzelf opruimen.

Sprite: Munt — een tweede, los script

wanneer ik als kloon start
toon
wacht tot raakt Speler ?
start geluid Coin
verander score met 10
verander munten met 1
als munten = 5 dan
zend signaal deur open
verwijder deze kloon
"wacht tot" is hier perfect. Elke kloon blijft geduldig op zijn plek staan en doet helemaal niets tot jij hem aanraakt. Geen lus nodig, geen rekenwerk. En omdat elke kloon zijn eigen script draait, wachten alle vijf de munten tegelijk — onafhankelijk van elkaar.
Twee tellers voor twee dingen. score is je puntentotaal (dat mag rommelig oplopen en zelfs dalen). munten telt hoeveel er in dit level opgeraapt zijn — daar hangt de deur aan vast. Zou je die twee samen nemen, dan zou de deur na een strafpunt plots weer dichtgaan.
  • Munten verdwijnen als ik ze aanraak en geven punten

Testmoment — verzamel alle vijf de munten

controle

Klik op de vlag en raap alle munten op. Je score hoort op 50 te staan en de teller "munten" op 5. Klopt het niet?

  • Je ziet geen munten? Staat "toon" in het kloon-script? Het origineel is verborgen, dus elke kloon moet zichzelf tonen.
  • Je ziet één munt die niet verdwijnt? Dat is het origineel — je bent "verberg" vergeten.
  • Eén munt geeft 20 of 30 punten? Je raakt hem meerdere beeldjes lang aan. Controleer dat "verwijder deze kloon" er echt onder staat.
  • De munten zweven in de lucht of zitten in een platform? Pas de start-x en start-y in stap 20 aan tot ze mooi liggen. Dit is gewoon puzzelen met getallen.
  • Je score gaat naar -5 terwijl je niet in het gat valt? Je speler raakt de onderrand omdat de grens -170 te hoog ligt voor jouw level. Zet hem op -175.
  • Alle vijf de munten geven samen 50 punten
23

De deur gaat pas open als alle munten weg zijn

Gebeurtenissen

Klik de sprite Deur aan. Bij de start staat hij op zijn plek maar is hij onzichtbaar. Zodra het signaal deur open binnenkomt, verschijnt hij.

Sprite: Deur

als wordt aangeklikt
maak grootte 70 %
ga naar x: 205 y: -95
verberg
Let op de y-waarde. Zet je deur zó neer dat de onderkant op je vloer staat. Sleep de sprite met je muis naar de juiste plek terwijl het spel niet draait, en lees dan de x en y af in het informatiepaneeltje boven de sprite-lijst. Typ die getallen over in je blok — dan staat de deur na elke herstart weer precies goed.
  • Mijn deur staat op zijn plek en is bij de start onzichtbaar
24

Door de deur: level 2 of gewonnen

Gebeurtenissen

Zet een tweede script bij de Deur. Hij verschijnt, wacht tot jij hem aanraakt, en kijkt dan naar de variabele level: sta je in level 1, dan stuurt hij je door; sta je in level 2, dan heb je gewonnen. Maak allebei de berichten aan in het dropdownlijstje.

Sprite: Deur — een tweede, los script

wanneer ik signaal deur open ontvang
toon
wacht tot raakt Speler ?
verberg
als level = 1 dan
maak level 2
zend signaal level 2
anders
zend signaal gewonnen
Waarom stuurt de deur en niet de speler? Omdat de deur precies weet wanneer hij aangeraakt wordt, en omdat je speler al genoeg te doen heeft in zijn drukke lus. Geef elke sprite één duidelijke taak: de speler beweegt, de munten tellen, de deur regelt de overgang. Zo blijft je project leesbaar — ook voor jezelf, over drie weken.
Waarom eerst "maak level 2" en dán het signaal? Anders is er een piepklein moment waarop de andere sprites al reageren terwijl de variabele nog op 1 staat. Zet je waarden altijd goed vóór je het nieuws rondstuurt.
  • De deur stuurt me door naar level 2
25

Level 2: iedereen reageert op het signaal

Uiterlijk

Nu bouw je je tweede level. Teken bij de sprite Grond een tweede uiterlijk met een andere indeling en noem het level2 (tip: klik met de rechtermuisknop op level1 en kies "dupliceren", dan hoef je alleen balken te verschuiven). Kies bij de Achtergronden twee achtergronden, bijvoorbeeld Blue Sky en Woods. Geef daarna elke sprite een klein script dat naar het signaal level 2 luistert.

Achtergrond — twee scripts

als wordt aangeklikt
verander achtergrond naar Blue Sky
wanneer ik signaal level 2 ontvang
verander achtergrond naar Woods

Sprite: Grond · Sprite: Speler — elk een extra script

wanneer ik signaal level 2 ontvang
verander uiterlijk naar level2
wanneer ik signaal level 2 ontvang
reset speler -200 100

Sprite: Munt — een derde script, met een nieuwe rij munten

wanneer ik signaal level 2 ontvang
maak munten 0
ga naar x: -140 y: 40
herhaal 5 keer
maak kloon van mijzelf
verander x met 70
Eén signaal, vier reacties. Dit is de mooiste eigenschap van signalen: de deur roept één keer "level 2!" en vier sprites doen tegelijk hun eigen ding. Wil je later een level 3? Dan voeg je gewoon overal een script erbij — je hoeft niets te herschrijven. Zo bouw je een spel dat kan groeien.
Vergeet "maak munten 0" niet. Zonder dat blok staat je muntenteller nog op 5 en gaat de deur van level 2 meteen open, nog voor je één munt hebt opgeraapt.
  • Level 2 heeft een andere achtergrond, andere platforms en nieuwe munten
26

Maak de lijst "hoogscores"

Lijsten

Ga naar Variabelen en klik onderaan op Maak een lijst. Noem ze hoogscores, voor alle sprites. Er verschijnt een leeg kader op je speelveld. Dit zijn de belangrijkste lijstblokken:

voeg iets toe aan hoogscores
verwijder 1 van hoogscores
verwijder alles uit hoogscores
lengte van hoogscores
Wat is een lijst? Een variabele is één doosje met één ding erin. Een lijst is een rij genummerde doosjes die vanzelf langer wordt als je er iets bij legt. Perfect voor dingen waar je er meerdere van wil bewaren: alle scores die ooit gehaald zijn, de namen van je spelers, of de volgorde van een verhaal. Het ronde blokje lengte van hoogscores vertelt je hoeveel er in staan.
Zet "verwijder alles uit hoogscores" NIET bij je startblokken! Dat is precies dezelfde valkuil als "maak score 0" in een lus zetten. Een hoogscorelijst is namelijk het enige in je project dat juist wél moet blijven staan tussen twee potjes door. Wis je hem bij elke start, dan heb je geen hoogscorelijst maar een lijst met exact één regel. Wil je hem toch leegmaken? Klik dan met de rechtermuisknop op het kader op je speelveld — of sleep het wisblok even los, klik erop, en sleep het weer weg.
  • De lijst hoogscores staat op mijn speelveld
27

Je score in de lijst zetten als het spel eindigt

Lijsten

Zet bij de Speler een laatste, los script dat luistert naar het signaal gewonnen. Het voegt je score toe aan de lijst, feliciteert je en stopt het spel. Precies hetzelfde script zou je ook onder een "game over"-signaal kunnen hangen — een lijst maakt geen verschil tussen winnen en verliezen, hij bewaart gewoon getallen.

Sprite: Speler — een los script

wanneer ik signaal gewonnen ontvang
voeg score toe aan hoogscores
zeg Uitgespeeld! gedurende 2 seconden
zeg lengte van hoogscores gedurende 2 seconden
stop alles
Wat vertelt "lengte van hoogscores"? Hoeveel potjes er al gespeeld zijn. Speel je voor de derde keer uit, dan zegt je speler "3". Je kan er ook iets leukers mee doen: vergelijk je score met het hoogste getal in de lijst en juich als je een record hebt. Dat is uitdaging C hieronder.
Blijft je lijst bewaard? Ja — Scratch slaat de inhoud van lijsten op in je project. Sla je project op, dan staan je hoogscores er de volgende keer nog in. Deel je je project op de Scratch-website, dan krijgt iedere bezoeker wel zijn eigen kopie.
  • Na het uitspelen verschijnt mijn score in de lijst

Eindtest — speel je platformspel helemaal uit

controle

Dit is de laatste test van de hele gids. Speel je spel van begin tot einde uit, twee keer na elkaar, zonder de code aan te raken. Loop deze eindcontrole af:

  • Begint ronde twee echt met score 0, level 1, munten 0, de eerste achtergrond én het uiterlijk level1 van je Grond? Vergeet vooral dat laatste niet — dat is de meest vergeten reset van allemaal.
  • Staat er na twee potjes ook echt twee keer een score in je lijst?
  • Speel drie minuten aan één stuk door. Wordt het traag? Dan blijft er ergens een munt-kloon hangen: controleer of je kloon-script eindigt op "verwijder deze kloon".
  • Kan je op elk platform van level 2 geraken? Test elke sprong afzonderlijk, ook de moeilijkste.
  • Kan je vals spelen? Probeer het bewust: in de lucht dubbel springen, door een muur wringen, de deur bereiken zonder munten. Vind je een gaatje, dan weet je meteen welk als-blok je moet aanscherpen.
  • Klik op het volledige-scherm-knopje en laat iemand anders spelen zonder één woord uitleg. Snapt hij binnen tien seconden wat de bedoeling is? Dan is je spel af.
  • Mijn opdracht 10 is af — twee levels, munten, deur en hoogscorelijst

Het volledige script

Zo ziet je afgewerkte eindproject eruit. Het zijn tien scripts, verdeeld over vier sprites en de achtergrond. Vergelijk vooral de grote lus van je Speler blok voor blok — de volgorde daarin is alles.

Sprite: Speler — het hoofdscript

als wordt aangeklikt
maak score 0
maak level 1
zet draaistijl op links-rechts
reset speler -200 100
herhaal voortdurend
verander snelheidY met -1
verander y met snelheidY
als raakt Grond ? dan
herhaal tot niet raakt Grond ?
verander y met 1
maak snelheidY 0
verander y met -2
als toets pijltje omhoog ingedrukt? en raakt Grond ? dan
start geluid Boing
maak snelheidY 14
verander y met 2
als toets pijltje rechts ingedrukt? dan
richt naar 90 graden
verander x met 5
als raakt Grond ? dan
verander x met -5
als toets pijltje links ingedrukt? dan
richt naar -90 graden
verander x met -5
als raakt Grond ? dan
verander x met 5
als y-positie < -170 dan
verander score met -5
reset speler -200 100

Sprite: Speler — de definitie van je eigen blok · het level-2-script · het eindscript

definieer reset speler startX startY
ga naar x: startX y: startY
maak snelheidY 0
richt naar 90 graden
maak grootte 50 %
toon
wanneer ik signaal level 2 ontvang
reset speler -200 100
wanneer ik signaal gewonnen ontvang
voeg score toe aan hoogscores
zeg Uitgespeeld! gedurende 2 seconden
stop alles

Sprite: Grond — twee scripts

als wordt aangeklikt
ga naar laag achtergrond
verander uiterlijk naar level1
toon
wanneer ik signaal level 2 ontvang
verander uiterlijk naar level2

Sprite: Munt — drie scripts

als wordt aangeklikt
maak grootte 35 %
verberg
maak munten 0
ga naar x: -160 y: -40
herhaal 5 keer
maak kloon van mijzelf
verander x met 80
wanneer ik signaal level 2 ontvang
maak munten 0
ga naar x: -140 y: 40
herhaal 5 keer
maak kloon van mijzelf
verander x met 70
wanneer ik als kloon start
toon
wacht tot raakt Speler ?
start geluid Coin
verander score met 10
verander munten met 1
als munten = 5 dan
zend signaal deur open
verwijder deze kloon

Sprite: Deur — twee scripts · Achtergrond — twee scripts

als wordt aangeklikt
maak grootte 70 %
ga naar x: 205 y: -95
verberg
wanneer ik signaal deur open ontvang
toon
wacht tot raakt Speler ?
verberg
als level = 1 dan
maak level 2
zend signaal level 2
anders
zend signaal gewonnen
als wordt aangeklikt
verander achtergrond naar Blue Sky
wanneer ik signaal level 2 ontvang
verander achtergrond naar Woods
De klassieke fout: zwaartekracht buiten de lus, of springen in de lucht Er zijn twee fouten die in élke klas opduiken, en ze lijken allebei onschuldig. Fout één: "verander snelheidY met -1" boven de lus zetten in plaats van erin. Je speler valt dan wel, maar met eeuwig dezelfde 1 pixel per stap. Het voelt alsof hij door stroop zakt, en springen wordt onmogelijk: je snelheid van 14 wordt nooit afgeremd, dus je vliegt gewoon het scherm uit. Zwaartekracht is geen instelling die je één keer doet — ze trekt elke stap opnieuw. Dat blok hoort dus in de lus, als allereerste. Fout twee: springen zonder te controleren of je op de grond staat. Laat je "en raakt Grond?" weg en kijk je alleen naar de toets, dan kan je in de lucht opnieuw springen — en nog eens, en nog eens. Hou je de toets ingedrukt, dan zweef je zo het scherm uit. Vergeet je daarentegen de tenen-truc uit stap 12, dan gebeurt het omgekeerde en kan je nooit springen, want je zweeft altijd één pixel boven de grond. Beide fouten wijzen op hetzelfde: bij zwaartekracht draait alles om volgorde — eerst vallen, dan landen, dan pas kijken of je mag springen. Twijfel je? Zet je speler tijdelijk op -0.3 zwaartekracht en kijk in slow motion mee met de teller op je speelveld.

Uitdagingen

Dit is de laatste opdracht van de gids — en dus ook je laatste kans om zelf iets uit te zoeken zonder uitgewerkte oplossing. Alle blokken die je nodig hebt, ken je nu.

A

Een bewegend platform

makkelijk

Maak een extra sprite "Lift" die traag heen en weer schuift, en waar je op kan staan. Tip: laat de speler ook "raakt Lift?" controleren, of — veel eenvoudiger — teken de lift in dezelfde sprite-familie als je Grond door hem een tweede uiterlijk te geven. Extra pittig: zorg dat je speler meebeweegt als hij erop staat.

B

Een vijand die heen en weer patrouilleert

middel

Voeg een vijand toe die over een platform loopt. Raak jij hem, dan verlies je tien punten en word je teruggezet met je eigen blok "reset speler". Tip: je hebt geen nieuwe blokken nodig — alleen "keer om aan de rand" of een als-blok dat de x-positie in de gaten houdt. Extra pittig: laat je hem verdwijnen als je er van bovenaf op springt (kijk dan naar snelheidY: die is dan negatief).

C

Een echte hoogscoretabel

pittig

Vraag met "vraag ... en wacht" om de naam van de speler en zet naam én score samen in de lijst met het blok samenvoegen uit Operatoren. Zorg daarna dat er nooit meer dan vijf regels in staan: is de lijst langer, verwijder dan de laagste. Tip: je hebt "lengte van hoogscores", een herhaal-lus en het blok "item ... van hoogscores" nodig. Dit is de moeilijkste uitdaging van de hele gids — als je dit kan, kan je alles wat Scratch te bieden heeft.

Vorige opdracht Alle opdrachten