9 · Ruimte-shooter met klonen

Je bouwt een echte arcade-shooter: jij bestuurt een ruimteschip onderaan, je schiet kogels omhoog en vijanden zakken naar beneden. Het geheim van deze opdracht heet klonen. Met één kogel-sprite maak je honderden kogels, en met één vijand-sprite een hele invasie. Je leert hoe je klonen maakt, hoe elke kloon zijn eigen script draait, en — het allerbelangrijkste — hoe je ze weer netjes opruimt.

★★★ pittig 24 stappen ongeveer 90 minuten

Wat leer je?

  • Wat een kloon is en waarom je er geen 30 sprites voor hoeft te tekenen
  • Het verschil tussen het origineel en zijn klonen
  • Het hoedblok wanneer ik als kloon start — elke kloon draait zijn eigen script
  • Waarom je elke kloon moet verwijderen en wat er gebeurt als je dat vergeet
  • Met signalen laten praten tussen sprites die elkaar niet kennen
  • Een spel in golven laten groeien met een variabele

Wat heb je nodig?

  • Een nieuw, leeg Scratch-project
  • De achtergrond Stars (of Space) uit de achtergrondenbibliotheek
  • De sprite Rocketship — dat wordt je Ruimteschip
  • De sprite Ball of Button3 — dat wordt je Kogel
  • De sprite Beetle of Ghost — dat wordt je Vijand
  • Twee korte geluidjes, bijvoorbeeld Laser1 en Pop

Klonen zijn nieuw voor je? Kijk eerst even in het Blokkenboek bij de categorie Besturing.

Stap voor stap

Je werkt met drie sprites en één achtergrond. Boven elk script staat daarom altijd bij welke sprite het hoort — klik die sprite éérst aan, anders bouw je bij de verkeerde figuur. Vink een stap af als hij klaar is; je browser onthoudt dat.

1

Zet je achtergrond en je drie sprites klaar

Uiterlijk

Gooi de kat weg. Klik rechtsonder op de achtergrond-knop en kies Stars. Voeg daarna drie sprites toe en geef ze meteen een duidelijke naam (klik op het naamvakje boven de sprite-lijst): Ruimteschip, Kogel en Vijand. Goede namen zijn hier geen luxe — je gaat straks in dropdownlijstjes kiezen "raakt Vijand?", en dan wil je niet zitten twijfelen tussen "Beetle2" en "Ball".

Drie sprites voor een heel leger? Ja. In dit spel vliegen er straks tientallen kogels en vijanden tegelijk over je scherm, maar je tekent er maar één van elk. De rest zijn klonen: kopieën die Scratch tijdens het spelen zelf maakt en weer opruimt.
  • Ik zie een sterrenhemel en drie sprites met nette namen
2

Zet het schip op zijn startplek

Beweging

Klik de sprite Ruimteschip aan. Geef hem een startgrootte en zet hem onderaan in het midden. Zo begint elke ronde exact hetzelfde, ook als je schip de vorige keer in een hoekje eindigde.

Sprite: Ruimteschip

als wordt aangeklikt
maak grootte 60 %
ga naar x: 0 y: -140
richt naar 90 graden
Waarom "richt naar 90 graden"? Je schip mag straks niet gaan draaien. 90 graden betekent "kijk naar rechts", en dat is de normale stand van elke sprite. Staat je raket op zijn zij? Klik dan op het uiterlijk-tabblad en draai de tekening zelf recht — niet de sprite.
  • Mijn schip staat onderaan in het midden
3

Bestuur het schip met links en rechts

Besturing

Sleep een herhaal voortdurend onder je startblokken en zet daar twee "als ... dan"-blokken in. De zeshoekjes vul je met "toets ... ingedrukt?" uit Waarneming. Zo kijkt Scratch tientallen keren per seconde opnieuw of jij een pijltje indrukt.

Sprite: Ruimteschip

herhaal voortdurend
als toets pijltje rechts ingedrukt? dan
verander x met 8
als toets pijltje links ingedrukt? dan
verander x met -8
Waarom twee losse als-blokken en geen als/anders? Met twee losse als-blokken kan je allebei de toetsen tegelijk indrukken (dan gebeurt er netjes niets, want +8 en -8 heffen elkaar op). Met als/anders zou "links" altijd verliezen van "rechts".
  • Mijn schip schuift naar links en naar rechts
4

Hou het schip binnen het scherm

Operatoren

Zonder rem verdwijnt je schip half buiten beeld. Zet onderaan in dezelfde herhaal voortdurend nog twee als-blokken. In het zeshoekje gebruik je de operator > of <, met daarin het ronde blokje x-positie uit Beweging.

Sprite: Ruimteschip — onderaan in de lus

als x-positie > 220 dan
ga naar x: 220 y: -140
als x-positie < -220 dan
ga naar x: -220 y: -140
Wat is x-positie? Dat ronde blokje bevat op elk moment het getal waar je sprite staat op de links-rechtsas. Je leest het uit; je kan er niets in stoppen. Het speelveld loopt van -240 tot 240, dus met een grens van 220 blijft je schip altijd helemaal zichtbaar.
  • Mijn schip botst tegen de zijkanten en blijft in beeld

Testmoment — vliegt je schip goed?

controle

Klik op de groene vlag en hou de pijltjes ingedrukt. Het schip hoort vloeiend heen en weer te schuiven en netjes te stoppen aan de randen. Loopt er iets mis?

  • Er gebeurt niets? Klik eerst één keer op het speelveld, anders luistert je browser nog niet naar Scratch.
  • Het schip beweegt één stapje en stopt dan? Je "herhaal voortdurend" ontbreekt, of de als-blokken staan eronder in plaats van erin. Sleep het hoedblok een stukje: alles moet meekomen.
  • Het schip gaat de verkeerde kant op? Dan staan 8 en -8 verwisseld.
  • Het schip trilt aan de rand? Dat mag. Zorg wel dat de y in je grensblokken exact -140 is, anders springt het schip een beetje omhoog of omlaag als je de rand raakt.
  • Het schip draait op zijn kop? Klik op het sprite-informatiepaneel en zet de draaistijl op "draai niet".
  • Mijn schip vliegt soepel en blijft binnen beeld
6

Verberg de kogel — het origineel doet niet mee

Uiterlijk

Klik de sprite Kogel aan. Maak hem klein en zet er meteen verberg onder. Dat voelt raar — je maakt een kogel die je nooit ziet — maar dat is precies de bedoeling.

Sprite: Kogel

als wordt aangeklikt
maak grootte 25 %
verberg
Het origineel is de mal, niet het product. Denk aan een koekjesvorm: die eet je niet op, je steekt er koekjes mee uit. De sprite Kogel is die vorm. Hij blijft onzichtbaar op de achtergrond wachten, en elke keer dat je schiet maakt Scratch er een kloon van: een echte, zichtbare kogel met een eigen positie en een eigen script. Zou je het origineel niet verbergen, dan zie je permanent een kogel bij je schip plakken.
  • Mijn kogel-sprite is onzichtbaar bij de start
7

Spatie maakt een kloon

Besturing

Zet onder je startblokken een herhaal voortdurend met daarin één als-blok: als de spatiebalk ingedrukt is, maak dan een kloon van jezelf. Het blok "maak kloon van mijzelf" vind je helemaal onderaan in Besturing. En vergeet de wacht 0.25 seconden niet — die staat er niet voor niets.

Sprite: Kogel

herhaal voortdurend
als toets spatie ingedrukt? dan
start geluid Laser1
maak kloon van mijzelf
wacht 0.25 seconden
Waarom die wachttijd? Een "herhaal voortdurend" draait ongeveer 30 keer per seconde. Zonder wacht-blok maak je dus 30 kogels per seconde: je scherm slibt dicht, je spel wordt traag, en na een paar seconden weigert Scratch nog klonen te maken (er mogen er maximaal 300 tegelijk bestaan). Met 0.25 seconden schiet je vier keer per seconde — snel genoeg om leuk te zijn, traag genoeg om speelbaar te blijven. Wil je dat elke druk op de spatiebalk exact één kogel geeft? Vervang het wacht-blok dan door wacht tot met daarin de operator niet en het zeshoekje "toets spatie ingedrukt?".
  • Mijn kogel maakt klonen als ik op spatie druk (nog niet zichtbaar)
8

Wanneer ik als kloon start — het tweede leven van je sprite

Besturing

Sleep een nieuw, apart hoedblok naar een lege plek in hetzelfde codegebied: "wanneer ik als kloon start". Dit script hoort bij niemand in het bijzonder — het draait telkens opnieuw, één keer per kloon. Laat elke kloon eerst naar het schip springen en zichzelf tonen.

Sprite: Kogel — een tweede, los script

wanneer ik als kloon start
ga naar Ruimteschip
toon
Dit is het moeilijkste idee van deze opdracht, dus lees even traag. Zodra "maak kloon van mijzelf" wordt uitgevoerd, ontstaat er een kopie. Die kopie krijgt alles mee wat het origineel op dat moment had: positie, grootte, uiterlijk, effecten. En dan begint bij die kopie — en alleen bij die kopie — het script onder "wanneer ik als kloon start" te lopen. Schiet je vijf kogels, dan lopen er vijf van die scripts tegelijk, elk met hun eigen y-positie. Ze weten niets van elkaar. Dat is precies waarom klonen zo krachtig zijn.
"ga naar Ruimteschip" staat in het dropdownlijstje van het blok "ga naar willekeurige positie". Klik erop en kies je schip. De kogel vertrekt zo altijd vanaf de plek waar jij op dat moment staat — ook al is dat elke keer ergens anders.
  • Er verschijnt een kogel bij mijn schip als ik op spatie druk
9

Laat de kloon omhoog vliegen

Besturing

Onder "toon" komt een herhaal tot-lus. Als voorwaarde gebruik je de operator of met daarin twee keer "raakt ...?": één keer rand, één keer Vijand. In de mond zet je "verander y met 12".

Sprite: Kogel

wanneer ik als kloon start
ga naar Ruimteschip
toon
herhaal tot raakt rand ? of raakt Vijand ?
verander y met 12
Waarom "herhaal tot" en niet "herhaal voortdurend"? Een kogel heeft een duidelijk einde: hij verlaat het scherm of hij raakt iets. "herhaal tot" stopt vanzelf zodra dat gebeurt en laat je script dáárna verder lopen — en dat "daarna" heb je in de volgende stap keihard nodig. Met "herhaal voortdurend" zou je nooit bij de volgende blokken komen.
Waarom 12 en niet 5? Een kogel hoort sneller te zijn dan alles wat je moet raken. Zet je het te laag, dan haalt je kogel de vijand niet in. Zet je het veel hoger (bijvoorbeeld 40), dan springt hij zó ver per stap dat hij dwars door een vijand heen kan schieten zonder hem ooit aan te raken.
  • Mijn kogels vliegen omhoog tot de bovenrand
10

Ruim de kloon op — het belangrijkste blok van deze les

Besturing

Zet helemaal onderaan, ná de "herhaal tot"-lus, het blok verwijder deze kloon. Het is een eindblok: het heeft geen nokje onderaan, want er kan niets meer volgen. Deze kloon houdt hier gewoon op te bestaan.

Sprite: Kogel

herhaal tot raakt rand ? of raakt Vijand ?
verander y met 12
verwijder deze kloon
Waarom moet dit per se? Een kloon die zijn script heeft afgewerkt verdwijnt niet vanzelf. Hij blijft roerloos hangen waar hij was, blijft geheugen gebruiken, en blijft meetellen voor de limiet van 300. Vergeet je dit blok, dan zie je na twintig seconden een muur van stilstaande kogels tegen de bovenrand plakken, en na een minuut schiet je helemaal niet meer — want Scratch weigert dan nieuwe klonen te maken. Wie klonen maakt, moet ze ook opruimen.
  • Mijn kogels verdwijnen netjes aan de bovenkant

Testmoment — schiet je schip?

controle

Klik op de vlag, vlieg heen en weer en hou de spatiebalk twintig seconden ingedrukt. Er hoort een gestage stroom kogels omhoog te gaan, en bovenaan moet elke kogel netjes verdwijnen. Klopt er iets niet?

  • Er verschijnt geen enkele kogel? Kijk of je twee losse scripts hebt bij de Kogel: één met de groene vlag en één met "wanneer ik als kloon start". Hangt dat tweede hoedblok per ongeluk vast onder het eerste script, dan draait het nooit.
  • Er blijft één kogel op het schip plakken? Je bent het blok "verberg" bij de start vergeten — je ziet het origineel.
  • Kogels blijven bovenaan hangen? "verwijder deze kloon" ontbreekt, of het staat per ongeluk binnen de herhaal-tot-lus.
  • Na een tijdje kan je niet meer schieten? Klassiek symptoom van vergeten opruimen: de kloonlimiet van 300 is bereikt. Klik op de rode stopknop; alle klonen verdwijnen dan in één keer.
  • Er komen kogels uit het midden van het scherm? "ga naar Ruimteschip" staat na de herhaal-lus in plaats van ervoor, of het dropdownlijstje staat nog op "willekeurige positie".
  • Ik kan blijven schieten zonder dat het spel vastloopt
12

Maak de variabelen score, levens en golf

Variabelen

Klik op Variabelen en maak er drie, telkens voor alle sprites: score, levens en golf. Zet ze alle drie klaar bij de startblokken van je Ruimteschip — dat is de enige sprite die geen klonen maakt, dus daar gebeurt zo'n startinstelling precies één keer.

Sprite: Ruimteschip — bovenaan, vóór de lus

als wordt aangeklikt
maak score 0
maak levens 3
maak golf 1
maak grootte 60 %
ga naar x: 0 y: -140
Waarom niet bij de Vijand? Omdat die straks klonen maakt. Elke kloon draait zijn eigen script, dus zou je "maak score 0" bij een kloon zetten, dan wordt je score gewist telkens als er een nieuwe vijand verschijnt. Zet startinstellingen altijd bij een sprite die maar één keer bestaat.
  • Score, levens en golf staan op het speelveld
13

Zend het signaal "raak" als je iets treft

Gebeurtenissen

Terug naar de Kogel. Zet tussen de herhaal-tot-lus en "verwijder deze kloon" een als-blok dat vraagt of je een vijand raakt. Zo ja: roep het door met zend signaal. Klik in het dropdownlijstje op "nieuw bericht" en noem het raak.

Sprite: Kogel

herhaal tot raakt rand ? of raakt Vijand ?
verander y met 12
als raakt Vijand ? dan
zend signaal raak
verwijder deze kloon
Waarom nog eens vragen "raakt Vijand?" Scratch onthoudt niet waarom je herhaal-tot-lus gestopt is. Er waren twee mogelijke redenen: rand of vijand. Door meteen daarna opnieuw te vragen weet je zeker welke van de twee het was — je staat op dat moment nog exact tegen de vijand aan.
Waarom een signaal en niet gewoon "verander score met 10"? Dat zou hier zelfs werken, maar een signaal is netter: de kogel weet niets van scores, hij roept alleen "raak!" het spel in. Wie daar iets mee wil doen — de score, een geluidje, een schermflits — luistert er gewoon naar. Zo blijft elk stukje code verantwoordelijk voor één ding.
  • Mijn kogel zendt het signaal "raak"
14

De vijand spawnt klonen

Besturing

Klik de sprite Vijand aan. Precies dezelfde truc als bij de kogel: verbergen bij de start, en dan in een lus telkens een kloon maken. Alleen wacht je nu een willekeurige tijd, zodat de vijanden niet als een metronoom binnenkomen.

Sprite: Vijand

als wordt aangeklikt
maak grootte 55 %
verberg
herhaal voortdurend
wacht willekeurig getal tussen 1 en 3 seconden
maak kloon van mijzelf
Waarom een willekeurige wachttijd? Wacht je altijd exact 2 seconden, dan leert je speler het ritme na drie golven uit het hoofd en wordt het saai. Met "willekeurig getal tussen 1 en 3" komt de volgende vijand soms meteen, soms wat later. Onvoorspelbaarheid is wat een spel spannend maakt. Let op: het wacht-blok staat vóór "maak kloon van mijzelf", zodat je niet meteen bij de start een vijand in je gezicht krijgt.
  • Mijn vijand-sprite maakt om de paar seconden een kloon
15

Elke vijand-kloon start bovenaan op een andere plek

Beweging

Sleep een tweede, los hoedblok "wanneer ik als kloon start" in het codegebied van de Vijand. Laat elke kloon bovenaan verschijnen op een willekeurige x, en zichzelf tonen.

Sprite: Vijand — een tweede, los script

wanneer ik als kloon start
ga naar x: willekeurig getal tussen -200 en 200 y: 170
toon
Let op de volgorde: eerst verplaatsen, dan tonen. Een kloon erft de positie van het origineel. Zou je eerst "toon" zetten en dan pas "ga naar", dan flitst de vijand heel even op de oude plek van het origineel voor hij naar boven springt. Een klein detail, maar precies zulke details maken het verschil tussen een schoolproject en een spel dat af voelt.
  • Er verschijnen vijanden bovenaan op wisselende plekken
16

Laat de vijand zakken tot hij geraakt wordt of de bodem haalt

Besturing

Onder "toon" komt een herhaal tot-lus met opnieuw een of: stoppen mag als de kloon een kogel raakt of als hij onder y = -150 zakt. In de mond zet je "verander y met -3". Sluit af met verwijder deze kloon — ook hier weer.

Sprite: Vijand

wanneer ik als kloon start
ga naar x: willekeurig getal tussen -200 en 200 y: 170
toon
herhaal tot raakt Kogel ? of y-positie < -150
verander y met -3
verwijder deze kloon
Waarom "y-positie < -150" en niet "raakt rand?" Omdat de vijand bij het verschijnen al bijna tegen de bovenrand plakt. Met "raakt rand?" zou de lus meteen stoppen en verdween elke vijand binnen een fractie van een seconde. Door zélf naar de y-positie te kijken, kies je precies waar de grens ligt: -150, netjes onderaan.
  • Vijanden zakken naar beneden en verdwijnen onderaan

Testmoment — komt de invasie op gang?

controle

Klik op de vlag en kijk een halve minuut toe zonder te schieten. Er horen om de paar seconden vijanden bovenaan te verschijnen die rustig naar beneden zakken en onderaan verdwijnen. Schiet daarna eens raak. Loopt er iets mis?

  • Er verschijnt geen enkele vijand? Staat "verberg" bij de start? Dan zie je het origineel niet — dat klopt. Maar staan er ook geen klonen? Kijk of het wacht-blok en het kloon-blok écht binnen de "herhaal voortdurend" zitten.
  • De vijanden verschijnen allemaal op dezelfde x? Het blokje "willekeurig getal" zit waarschijnlijk in het verkeerde vakje, of je hebt er een vast getal ingetypt.
  • De vijanden verdwijnen meteen na het verschijnen? Je gebruikt "raakt rand?" in plaats van de y-positie-vergelijking, of je begint op y = 180 in plaats van 170.
  • De vijand verdwijnt niet als je hem raakt? Controleer of in het dropdownlijstje van "raakt ...?" echt Kogel staat, en niet een oude spritenaam.
  • Alles wordt na een minuut traag? Dan mist er ergens "verwijder deze kloon". Kijk zowel bij de Kogel als bij de Vijand.
  • Vijanden komen binnen, zakken en verdwijnen als ik ze raak
18

Punten tellen met "wanneer ik signaal raak ontvang"

Gebeurtenissen

Klik de sprite Ruimteschip aan en zet daar een derde, los script neer: het hoedblok "wanneer ik signaal raak ontvang" met daaronder "verander score met 10".

Sprite: Ruimteschip — een los script

wanneer ik signaal raak ontvang
verander score met 10
Waarom bij het schip en niet bij de vijand? Dit is een echte kloon-valkuil. Een signaal komt binnen bij elke sprite én bij elke kloon die ernaar luistert. Zet je dit script bij de Vijand terwijl er zeven vijand-klonen rondvliegen, dan krijg je bij één treffer zeven keer 10 punten. Het Ruimteschip bestaat maar één keer en maakt nooit klonen — daar telt het dus precies één keer. Vuistregel: tellen doe je bij een sprite die uniek is.
  • Elke treffer geeft precies 10 punten
19

Een vijand die de bodem haalt kost een leven

Variabelen

Terug naar de Vijand. Zet tussen de herhaal-tot-lus en "verwijder deze kloon" een als ... dan ... anders. Raakt hij een kogel? Dan een plopje. Anders is hij doorgezakt tot onderaan, en dat kost jou een leven.

Sprite: Vijand

als raakt Kogel ? dan
start geluid Pop
anders
verander levens met -1
verwijder deze kloon
Waarom mag "verander levens met -1" hier wél bij een kloon staan? Omdat het per kloon precies één keer gebeurt, op het moment dat die ene kloon ophoudt te bestaan. Eén doorgezakte vijand = één leven eraf. Dat is heel wat anders dan een signaal, dat bij álle klonen tegelijk binnenkomt. Verwar die twee niet.
  • Een vijand die ontsnapt kost me precies 1 leven

Testmoment — kloppen je score en je levens?

controle

Speel een halve minuut en hou de twee tellers linksboven scherp in de gaten. Schiet drie vijanden neer (dat hoort exact 30 punten te zijn) en laat er drie ontsnappen. Klopt het niet?

  • Score springt met 20, 30 of 70 tegelijk? Je "wanneer ik signaal raak ontvang" staat bij de Vijand of bij de Kogel in plaats van bij het Ruimteschip. Sleep het script naar het schip: pak het hoedblok vast en laat het los op de sprite-tegel van het Ruimteschip.
  • Score verandert nooit? Heet je bericht overal exact hetzelfde? "raak" en "Raak" zijn twee verschillende signalen in het dropdownlijstje.
  • Levens gaan meteen naar 0? De als/anders staat in de herhaal-tot-lus in plaats van eronder — dan telt hij bij élke stap naar beneden een leven af.
  • Levens gaan omlaag terwijl je raak schiet? Je kogel raakt de vijand net niet meer op het moment dat de vijand controleert. Maak je kogel of je vijand iets groter, of zet de kogelsnelheid van 12 naar 10.
  • Score blijft op 0 hangen ondanks treffers? Kijk of "maak score 0" niet per ongeluk in de "herhaal voortdurend" van je schip terechtgekomen is.
  • Drie treffers = 30 punten, drie ontsnappers = 3 levens minder
21

Golven — het spel wordt zwaarder

Variabelen

Zet bij de Vijand een derde, los script: elke 20 seconden gaat de variabele golf één omhoog. Vervang daarna in je zak-lus het vaste getal -3 door de operator min uit Operatoren: -2 min golf. In golf 1 zak je dus met -3, in golf 2 met -4, in golf 5 met -7.

Sprite: Vijand — een derde, los script

als wordt aangeklikt
herhaal voortdurend
wacht 20 seconden
verander golf met 1

Sprite: Vijand — in de zak-lus van de kloon

herhaal tot raakt Kogel ? of y-positie < -150
verander y met -2 - golf
Waarom een rekenblokje in plaats van gewoon een variabele "snelheid"? Allebei kan. Maar zo zie je in één oogopslag hoe de moeilijkheid met de golf meegroeit, en je hebt maar één variabele nodig om je hele spel te sturen. Zet je "golf" even op 8 met het schuifje op je speelveld (rechtsklik op de teller en kies "schuifknop"), dan test je meteen hoe golf 8 aanvoelt zonder er drie minuten voor te spelen.
Let op het minteken. Naar beneden is negatief. "-2 min golf" wordt dus steeds negatiever: -3, -4, -5 ... Zou je "+" gebruiken, dan gaan je vijanden na een tijdje juist omhoog vliegen. Reken het gerust even na op papier.
  • Na 20 seconden zakken de vijanden merkbaar sneller
22

Game over bij 0 levens

Besturing

Een spel dat nooit eindigt, is geen spel. Zet bij het Ruimteschip nog een los script neer met het blok wacht tot uit Besturing. Daarin komt de operator = met het ronde blokje levens en het getal 0.

Sprite: Ruimteschip — een los script

als wordt aangeklikt
wacht tot levens = 0
zeg Game over! gedurende 2 seconden
stop alles
"wacht tot" is een geduldig blok. Het houdt dit ene script tegen tot de voorwaarde waar wordt, terwijl al je andere scripts gewoon doorlopen. Je hebt er dus geen "herhaal voortdurend" met een als-blok voor nodig — dit is korter en leest veel duidelijker.
Goed nieuws over klonen: "stop alles" ruimt in één klap alle bestaande klonen op. Ook als je op de rode stopknop drukt of opnieuw op de groene vlag klikt, begint Scratch met een schone lei — zonder klonen. Je hoeft daar dus zelf niets voor te doen.
  • Bij 0 levens stopt het spel met een boodschap
23

Feedback voor de speler: een flits bij elke treffer

Uiterlijk

Een goed spel reageert. Breid je "wanneer ik signaal raak ontvang" bij het Ruimteschip uit met een korte kleurflits. Zet daarna het effect meteen weer op 0, anders blijft je schip permanent van kleur veranderen.

Sprite: Ruimteschip

wanneer ik signaal raak ontvang
verander score met 10
verander helderheid effect met 40
wacht 0.05 seconden
zet helderheid effect op 0
Waarom 0.05 seconden? Dat is ongeveer één twintigste van een seconde: net lang genoeg om te zien, veel te kort om te storen. Zet het op een halve seconde en je spel voelt meteen traag aan. Voeg gerust ook een verander toonhoogte of een tweede geluidje toe — maar hou alles wat tijdens het spelen gebeurt kort.
  • Mijn schip flitst even op bij elke treffer

Eindtest — speel je shooter helemaal uit

controle

Speel tot je alle drie je levens kwijt bent, en start dan meteen een tweede ronde. Alles moet weer schoon van voren af aan beginnen. Loop deze eindcontrole af:

  • Begint ronde twee echt met score 0, 3 levens én golf 1? Zo niet: er ontbreekt een "maak ..."-blok bij de startinstellingen van je schip.
  • Blijft het spel doorlopen ná "Game over"? Dan zit "stop alles" er niet, of het staat buiten je script.
  • Speel drie minuten aan één stuk door. Wordt het spel traag of haperig? Dan blijft er ergens een kloon hangen. Kijk of allebei je "wanneer ik als kloon start"-scripts eindigen op verwijder deze kloon.
  • Is golf 4 nog te doen? Zo niet: verhoog de kogelsnelheid, of zet de golf-wachttijd van 20 op 30 seconden. Een spel moet moeilijk zijn, niet oneerlijk.
  • Klik op het volledige-scherm-knopje en laat een klasgenoot spelen zonder uitleg. Begrijpt hij binnen tien seconden wat hij moet doen? Dat is de echte test.
  • Mijn opdracht 9 is af — de shooter is uitspeelbaar en herspeelbaar

Het volledige script

Zo ziet je afgewerkte project eruit: zeven losse scripts, verdeeld over drie sprites. Vergelijk ze zorgvuldig met wat er op jouw scherm staat — vooral of een hoedblok echt bovenaan een los script staat.

Sprite: Ruimteschip — script 1: starten en besturen

als wordt aangeklikt
maak score 0
maak levens 3
maak golf 1
maak grootte 60 %
richt naar 90 graden
ga naar x: 0 y: -140
herhaal voortdurend
als toets pijltje rechts ingedrukt? dan
verander x met 8
als toets pijltje links ingedrukt? dan
verander x met -8
als x-positie > 220 dan
ga naar x: 220 y: -140
als x-positie < -220 dan
ga naar x: -220 y: -140

Sprite: Ruimteschip — script 2: punten tellen · script 3: game over

wanneer ik signaal raak ontvang
verander score met 10
verander helderheid effect met 40
wacht 0.05 seconden
zet helderheid effect op 0
als wordt aangeklikt
wacht tot levens = 0
zeg Game over! gedurende 2 seconden
stop alles

Sprite: Kogel — script 1: schieten · script 2: het leven van één kogel

als wordt aangeklikt
maak grootte 25 %
verberg
herhaal voortdurend
als toets spatie ingedrukt? dan
start geluid Laser1
maak kloon van mijzelf
wacht 0.25 seconden
wanneer ik als kloon start
ga naar Ruimteschip
toon
herhaal tot raakt rand ? of raakt Vijand ?
verander y met 12
als raakt Vijand ? dan
zend signaal raak
verwijder deze kloon

Sprite: Vijand — script 1: klonen spawnen · script 2: het leven van één vijand · script 3: de golfteller

als wordt aangeklikt
maak grootte 55 %
verberg
herhaal voortdurend
wacht willekeurig getal tussen 1 en 3 seconden
maak kloon van mijzelf
wanneer ik als kloon start
ga naar x: willekeurig getal tussen -200 en 200 y: 170
toon
herhaal tot raakt Kogel ? of y-positie < -150
verander y met -2 - golf
als raakt Kogel ? dan
start geluid Pop
anders
verander levens met -1
verwijder deze kloon
als wordt aangeklikt
herhaal voortdurend
wacht 20 seconden
verander golf met 1
De klassieke fout: klonen die je nooit opruimt Dit is dé valkuil van deze opdracht, en bijna iedereen trapt er één keer in. Je bouwt je kogel, hij vliegt prachtig omhoog, je bent tevreden — en je vergeet verwijder deze kloon. In het begin merk je niets. Na tien seconden zie je een rijtje kogels tegen de bovenrand plakken. Na dertig seconden wordt je spel stroperig. Na een minuut kan je helemaal niet meer schieten, terwijl er nergens een foutmelding verschijnt. De reden: een kloon die zijn script heeft afgewerkt verdwijnt niet vanzelf. Hij blijft bestaan, hij blijft rekenkracht opeten, en Scratch laat er maximaal 300 tegelijk bestaan. Boven die grens doet "maak kloon van mijzelf" gewoon niets meer. De vuistregel: elk script dat begint met "wanneer ik als kloon start", eindigt met "verwijder deze kloon". Twijfel je of het goed zit? Klik op de rode stopknop en kijk of je scherm helemaal leeg wordt — blijven er sprites staan die er niet horen, dan weet je genoeg.

Uitdagingen

Klaar en nog tijd over? Deze drie uitdagingen hebben géén uitgewerkte oplossing — zoek zelf uit hoe je ze oplost. Alle blokken die je nodig hebt, ken je nu.

A

Een schild dat je kan oppikken

makkelijk

Voeg een vierde sprite toe die af en toe naar beneden zweeft. Raak jij hem met je schip, dan krijg je er een leven bij. Tip: het script lijkt sterk op dat van de Vijand — verbergen, klonen maken met een lange wachttijd, zakken, en bij "raakt Ruimteschip?" een leven erbij in plaats van eraf. Vergeet je "verwijder deze kloon" niet.

B

Vijanden die terugschieten

middel

Maak een vijfde sprite "Vijandkogel" die klonen maakt op de plek van een vijand en naar beneden vliegt. Raakt zo'n kogel jouw schip, dan verlies je een leven. Tip: het lastigste is waar zo'n kogel moet ontstaan. Denk na over hoe een vijand-kloon zelf een kogel kan afvuren, en welk blok in Scratch een kloon van een andere sprite kan maken.

C

Een eindbaas met een levensbalk

pittig

Laat vanaf golf 5 één grote eindbaas verschijnen die pas na tien treffers verdwijnt. Tip: je hebt een aparte variabele bazenlevens nodig, en de baas mag géén "verwijder deze kloon" doen zolang die variabele boven 0 staat. Extra pittig: teken een levensbalk door een dunne sprite breder en smaller te maken met "maak grootte ... %", gestuurd door bazenlevens.

Vorige opdracht 10 · Platformspel met zwaartekracht