====== Space Invader (enkel variant) ======
I denne oppskriften skal du trinn for trinn bygge opp en enkel variant av spillet Space Invader med bare én invader (i gangen) og en defender. Defender skal forsøke å skyte invader, og får ett poeng pr. invader som blir skutt ned. For hver invader som unnslipper mister defender ett liv.
===== Ved start - initialiser spillet =====
Ved start skal du lage tre variabler du kaller //invader//, //defender// og //missil//. I hver av disse variablene skal du lage en brikke og plassere brikkene på fornuftige steder på skjermen.
Du lager brikker til spillet ved å bruke kommandoen "lag brikke på x: y:" fra menyen for **Spill**. Det er mulig du må trykke på **Avansert** for at denne menyen skal bli synlig.
Koordinatene X og Y betegner hvor brikken skal plasseres i forhold til øverste venstre hjørne. En koordinat med X=2 og Y=3 vil bety 2 hakk bortover og 3 hakk nedover.
En naturlig plassering for invader er på øverste linje på skjermen (Y=0), X kan være hva som helst, gjerne et tilfeldig tall fra menyen for **Matematikk**.
En naturlig plassering for //defender// kan være på nederste linje på skjermen (Y=4), X kan være hva som helst, gjerne et tilfeldig tall fra menyen for **Matematikk**. Du bør plassere //missil// på samme sted som //defender//.
Selv om vi har opprettet en brikke for //missil// skal den ikke være synlig på skjermen enda. Bruk "angi"-kommandoen fra **Spill**-menyen til å angi lysstyrke 0 på missilet. Missilet skal være synlig etter at det er avfyrt, ellers usynlig.
{{url>https://jsfiddle.net/royeven/87ypu6k1/1/embedded/css,html,result/ 100%,400 noscroll noborder left}}
===== Vanskegrad =====
Spillet blir vanskeligere dersom //invader// beveger seg fort, og lettere om //invader// er treig. Lag en variabel som du kaller //invader_speed// og en variabel du kaller //missil_speed// og sett dem til henholdsvis 2000 og 100. Du kan endre disse verdiene senere i spillet om du vil.
{{url>https://jsfiddle.net/royeven/87ypu6k1/3/embedded/css,html,result/ 100%,400 noscroll noborder left}}
===== Poeng og liv =====
Ved oppstart av spillet skal du ha 0 poeng og 3 liv. Du får ett nytt poeng hver gang du skyter og treffer //invader// og du mister ett liv hver gang //invader// passerer forbi deg.
Du finner kommandoer for dette i **Spill**-menyen.
{{url>https://jsfiddle.net/royeven/87ypu6k1/4/embedded/css,html,result/ 100%,400 noscroll noborder left}}
===== Flytte defender =====
//Defender// må kunne flytte seg til sidene, og det kan være naturlig å bruke knappene A og B til å flytte brikken //defender//. Når knapp A trykkes skal defender flytte seg til venstre og når knapp B trykkes skal defender flytte seg til høyre.
Du finner funksjoner for "når knapp A trykkes" og "når knapp B trykkes" under **Inndata**-menyen.
Du kan endre //defender// sin posisjon ved å bruke "sprite endre x med"-kommandoen fra **Spill**-menyen.
Hvis du endrer x med 1 vil x-koordinaten øke med 1 og brikken flytte seg til høyre. Hvis du endrer x-koordinaten med -1 vil x-koordinaten avta med 1 og brikken flyttes til venstre.
{{url>https://jsfiddle.net/royeven/87ypu6k1/5/embedded/css,html,result/ 100%,400 noscroll noborder left}}
===== Flytte invader =====
I denne enkle varianten av Space Invader vil //invader// bevege seg mot //defender//, og dersom //defender// ikke skyter //invader// vil //invader// forsvinne fra skjermen før en ny //invader// kommer til syne øverst på skjermen. Programmeringsmessig skal vi løse dette ved å flytte //invader// tilbake til toppen på skjermen (Y=0) hver gang den kommer seg forbi defender (Y=4). Vi må først lage oss en egen funksjon som skal flytte //defender// tilbake til toppen av brettet. Trykk på **Avansert** og deretter på **Funksjon**. Der skal du lage en ny funksjon som heter "resetInvader". De skal ikke legge til noen parametre til denne, bare trykke fullført etter å ha endret navnet på funksjonen "gjørNoe" til "resetInvader".
Etterpå skal du legge kommandoer i denne funksjonen som angir invader sin Y-koordinat til 0 og invader sin X-koordinat til et tilfeldig tall.
{{url>https://jsfiddle.net/royeven/87ypu6k1/7/embedded/css,html,result/ 100%,400 noscroll noborder left}}
===== Avfyre missil =====
Når du trykker på knapp A+B (altså A og B samtidig) skal //missil// (som nå er usynlig ett eller annet sted på skjermen) flyttes til //defender// sin koordinat, bli synlig, og bli skutt ut fra defender. //Missil// skal bevege seg oppover på skjermen helt til det kommer til toppen. Der skal det på nytt bli usynlig og vente på neste avfyring.
Alt som skal skje med //missil// må skje inni en "når knapp A+B trykkes"-blokk som du finner under **Inndata**.
Du ønsker å angi //missil// sin y-koordinat til samme y-koordinat som //defender// har. Og ditto for x-koordinatene. Du kan deretter angi //missil// sin lysstyrke til 255, som er maksimal lysstyrke.
Etter at missilet har blitt synlig skal det endre sin y-koordinat 4 ganger i negativ retning (oppover) før det på nytt skal bli usynlig.
Du bør bruke variabelen //missil_speed// til å bestemme hvor fort missilet skal gå. F.eks. kan du ta en pause i //missil_speed// millisekunder etter hvert skritt missilet blir flyttet.
{{url>https://jsfiddle.net/royeven/87ypu6k1/17/embedded/css,html,result/ 100%,400 noscroll noborder left}}
===== Sprenge invader =====
For hver gang du flytter //missil// ett hakk bør du sjekke om //missil// kolliderer med (berører) //invader//. I så fall kan du øke poengsummen din med 1, angi //missil// sitt lysstyrke til 0 (usynlig) og resette //invader// ved å bruke funksjonen du lagde i stad.
Du kan sjekke om //missil// og //invader// er på samme plass ved å bruke en "hvis"-blokk fra **Logikk**-menyen og "sprite berører ..."-kommandoen fra **Spill**.
{{url>https://jsfiddle.net/royeven/87ypu6k1/11/embedded/css,html,result/ 100%,400 noscroll noborder left}}
===== Automatisk bevegelse av invader =====
Nå skal vi la //invader// flytte seg automatisk nedover skjermen. Dette kan oppnås ved å bruke en "gjenta for alltid"-løkke fra **Basis**-menyen. Det som skal gjentas er følgende algoritme (et teknisk for for oppskrift):
Gjenta for alltid:
- Endre //invader// sin y-koordinat med 1
- Ta pause i //invader_speed//
- Hvis //invader// berører //defender//
- mist ett liv
- reset invader
- ellers hvis //invader// er på bunnen
- mist ett poeng
- reset //invader//
Med denne løsningen mister du liv hvis du kolliderer med //invader//. Hvis du unngår kollisjon mister du bare ett poeng for hver //invader// som unnslipper. Ved å trykke på "Result" under får du opp et ukomplett løsningsforslag som du kan ta utgangspunkt i.
{{url>https://jsfiddle.net/royeven/87ypu6k1/13/embedded/css,html,result/ 100%,400 noscroll noborder left}}
Ved å trykke på "Result" under får du et komplett løsningsforslag.
{{url>https://jsfiddle.net/royeven/87ypu6k1/14/embedded/css,html,result/ 100%,400 noscroll noborder left}}
====== Egen innsats ======
* Greier du å endre på spillet slik at du mister liv for hver invader som unnslipper?
* Greier du å endre på spillet slik at invader går fortere når du passerer et visst antall poeng?
* Greier du å endre spillet slik at du har to invadere som går samtidig?