Et spill blir skapt (del 3)

Nå nærmer vi oss noe ordentlig, her (selv om GOTY-prisen kanskje var litt optimistisk).

Dette er tredje del i min lille «spillutviklerdagbok» for et superenkelt arkadespill jeg har laget for Sharp MZ-80A. Den første leser du her, og her er nummer to.

Den nåværende versjonen av spillet mitt kan bare så vidt kalles et spill. Jeg har hovedmekanismen i orden, men når man treffer UFO-en avsluttes spillet, og om man ikke klarer å treffe den, blir den til slutt usårbar og brukeren må avslutte spillet ved hjelp av BREAK/CTRL-knappen.

Nå begynner vi å snakke spill, her.
Nå begynner vi å snakke spill, her.

Ah, og i stedet for å skyte en kule, skyter kanonen min en UFO. Ja, jeg vet. Forrige gang sa jeg det var en ball, men det var fordi … uh, se der! En trehodet apekatt! Anyhoo! Det første jeg gjør denne gangen, er å erstatte UFO-en som skytes opp med ballen. Den har som nevnt i forrige del skjermkoden 71, så for å vise en ball i stedet for en UFO bytter jeg bare ut 199 med 71 i POKE-kommandoene for kulen.

Rammeverket legges inn

Så legger jeg inn det grunnleggende rammeverket for spillet. Når man treffer en UFO, velger jeg rett og slett bare at den nåværende UFO-en skal fjernes fra skjermen, og en ny UFO skal dukke opp i toppen. Det er bedre enn å avslutte spillet, i alle fall. Jeg legger også inn en kondisjon for tap. Dette gjør jeg ved hjelp av en IF, THEN-kommando som kjøres for hver gang UFO-ens skjermposisjon oppdateres. Jeg velger en mer eller mindre tilfeldig skjermaddresse langt nede på skjermen (men over kanonen), og sier at hvis UFO-ens posisjon er lik eller lavere enn denne, så taper spilleren.

Tittelskjermen. Legg merke til UFO-ene jeg POKEt inn sammen med spillnavnet. Det er detaljer som dette som sikrer at spillet går fra karakteren 8 til karakteren 9 når det blir anmeldt av alle de store sidene.
Tittelskjermen. Legg merke til UFO-ene jeg POKEt inn sammen med spillnavnet. Det er detaljer som dette som sikrer at spillet går fra karakteren 8 til karakteren 9 når det blir anmeldt av alle de store sidene.

Jeg legger også inn muligheten til å velge vanskelighetsgrad. Vanskelighetsgraden styrer simpelthen hvor langt UFO-en spretter nedover på skjermen hvis man bommer – én rad på den enkleste vanskelighetsgraden, tre på den tøffeste. I praksis implementerer jeg dette ved å legge inn en variabel i stedet for et tall i utregningen som flytter ballen nedover – altså i stedet for å si at posisjonen skal øke med 40, som er en hel rad, sier jeg at den skal øke med tallet som er i variabelen T. Den kan ha verdiene 40, 80 og 120, og hvilken verdi som er der bestemmes når brukeren skriver inn hvilken vanskelighetsgrad han eller hun ønsker.

Fordi spillet nå begynner å ligne på noe, legger jeg inn en skjerm med instruksjoner, som man nå vender tilbake til etter at man har tapt. Sist, men ikke minst, gir jeg spillet mitt et navn – Astro Attackers. Det var det første jeg kom på, og det høres ut som et passende autentisk «tidlig åttitalls»-spillnavn. Beware of the Astro Attackers – litt bedre enn Beware of the Tiny UFOs!

Jeg vil gjøre dette skikkelig

Skjermbilde fra spillet.
Skjermbilde fra spillet.

Nå har jeg faktisk klart å lage et «ordentlig» spill, og jeg kunne jo ha stoppet her. Men jeg tenker at når jeg først skal gjøre dette, så skal jeg gjøre det skikkelig. Så jeg går nærmest umiddelbart i gang med neste versjon.

Det første jeg vil ha i denne versjonen, er muligheten til å faktisk slå spillet. Jeg velger noe enkelt – drep ti UFO-er for å vinne. Det gjør jeg ved å legge inn en teller – en variabel der tallet økes med én hver gang brukeren skyter ned en UFO. Så har jeg en IF THEN-linje der jeg sier at hvis tallet i denne variabelen har blitt 10, så vinner spilleren. Denne linjen kjøres også hver gang en UFO treffes, slik at spillet sjekker om telleren har nådd 10 hver gang tallet økes med én.

Jeg syntes landskapet fungerer bra. Siden kanonen tegnes senere, tegnes den alltid foran landskapet.
Jeg syntes landskapet fungerer bra. Siden kanonen tegnes senere, tegnes den alltid foran landskapet.

Så må jeg ha en måte å gi spilleren poeng på. Jeg bestemmer meg for å gjøre også dette ganske enkelt – rett og slett ved å trekke tallet som representerer den siste skjermposisjonen UFO-en kan nå før spillet registreres som tap, fra tallet som representerer den skjermposisjonen UFO-en befinner seg på når den skytes ned. Det betyr at resultatet av regnestykket blir mindre og mindre jo lenger ned på skjermen UFO-en kommer, og for maksimal uttelling må UFO-en skytes ned på første linje. Tallet jeg kommer frem til plusses så inn i variabelen for poengsummen.

Legg merke til at tegnsettet også har små strekmenn. Slikt kommer godt med for oss, ahem, «spillutviklere».
Legg merke til at tegnsettet også har små strekmenn. Slikt kommer godt med for oss, ahem, «spillutviklere».

Den siste lovlige skjermposisjonen for UFO-en er 53880. Hvis UFO-en treffes på samme linje som dette, får spilleren kun ti-tjue poeng. Men hvis den treffes på den øverste linjen blir det flere hundre. For hver linje UFO-en klatrer ned, minsker den potensielle poengsummen med 40, siden det er 40 tegnposisjoner i hver linje.

Poengsummen må også vises på skjermen, hvis ikke er det jo ikke mye poeng (kremt) i den. Helt nede til høyre legger jeg inn teksten SCORE (helt i starten, samtidig med at jeg tegner opp kanonen), og ved hjelp av den tidligere nevnte CURSOR-kommandoen og PRINT, skriver jeg inn tallet i variabelen for poengsummen der, hver gang en UFO skytes.

Belønning for spilleren

Jeg bestemmer meg også for å legge inn en slags visuell belønning for å skyte ned en UFO. Først ved at UFO-en «sprenger» – det vil si, jeg erstatter den i et kort øyeblikk med en blinkende asterisk, før den skikkelige belønningen begynner:

I bunnen av skjermen legger jeg inn noen strekmenn – disse lages ved hjelp av enkle tegn, akkurat som UFO-en – og hver gang spilleren treffer en UFO, får jeg dem til å hoppe opp og ned. I stedet for å være smart, og bruke kode som animerer dem på samme måte som ballen og kula (med vekselvis -40 og +40), gjør jeg denne animasjonen manuelt med et halvt tonn POKE-kommandoer. Nok en gang bruker jeg MUSIC-kommandoen for å sikre at ting animeres i riktig hastighet, og denne gangen veksler jeg på å spille to forskjellige noter når de hopper. Det høres litt mer «hoppete» ut.

Manualen forklarer FOR-NEXT.
Manualen forklarer FOR-NEXT.

Forresten! Det er én detalj med denne animasjonen som jeg kan forklare nærmere. Jeg velger nemlig å legge den inn i en FOR – NEXT-sløyfe. En FOR – NEXT-sløyfe er rett og slett en enkel måte for noe å repeteres på. Her er et eksempel:

10 FOR X = 1 TO 10
20 PRINT X
30 NEXT X
40 END

Det som skjer her, er at linje 10 sier at vi nå skal gjennom en sløyfe der variabelen X skal gå gjennom verdiene 1 til og med 10. I linje 20, skriver jeg ganske enkelt inn tallet X representerer på skjermen. I første omgang er det 1. I linje 30 sier jeg at nå skal jeg gå videre til neste verdi, altså 2. Så hopper programmet tilbake til første kommando etter FOR-setningen – linje 20 i dette tilfellet. Dermed skriver PRINT-kommandoen tallet 2. Og slik gjentas det, helt til X-verdien har blitt 10. Først da vil programmet hoppe til neste kommando, som i linje 40 avslutter programmet (siden linje 40 er siste linje uansett, er END-kommandoen helt unødvendig, men den gjør ikke noe skade heller).

Du kan jo prøve å gjette deg til hva som skjer når dette programmet kjøres:

10 FOR X=0 TO 9
20 FOR Y=0 TO 9
30 PRINT X;Y
40 NEXT Y
50 NEXT X

Semikolon betyr at verdien de to tingene som PRINTes på skjermen skal komme rett etter hverandre, i stedet for på separate linjer (hvis jeg hadde lagt inn en semikolon etter Y-en også, så ville det aldri vært noe linjeskift i programmet overhodet).

Slike FOR-NEXT-sløyfer kan være mer avanserte enn som så – hvis jeg for eksempel skulle ha behov for å gå gjennom spesifikke skjermposisjoner «bakover», kan jeg skrive noe slikt som FOR X = 54208 TO 53287 STEP -1. Jeg kan til og med legge inn variabler, slik at vi får noe slikt som FOR X = A TO B – dette er greit om jeg for eksempel vil ha en generell FOR-NEXT-sløyfe som passer til flere situasjoner.

X er forresten bare et eksempel, jeg kan bruke hvilke tallvariabler som helst. Disse trenger heller ikke å brukes inni selve sløyfen – jeg kan ha hva som helst der, og variabelen kan kun brukes som en ren teller om jeg ønsker det. Jeg kan til og med ha flere ekstra FOR-NEXT-sløyfer inni en og samme FOR-NEXT-sløyfe, men da må jeg huske på å bruke andre variabler for disse, slik at maskinen ikke går surr i tellingen.

I dette tilfellet bruker jeg FOR-NEXT-sløyfen for å sikre at mennene hopper opp og ned et gitt antall ganger, før spillet går videre til neste UFO.

Ser du hva du har gjort? Du har drept dem!
Ser du hva du har gjort? Du har drept dem!

Ah! Og jeg har gjort én ting til – jeg har laget en Game Over-beskjed, med litt ekstra. For å vise konsekvensen av tap, bytter jeg ut de stående strekmennene med liggende strekmenn (de er døde nå som UFO-en har fått lande!). I tillegg spiller jeg noen lyder med MUSIC-kommandoen. Jeg har også, endelig, oppdaget TEMPO-kommandoen, som lar meg endre hvor lenge hver note spiller. Med den har jeg nå ordnet det slik at kulen beveger seg raskere enn UFO-en. Her er en video som viser hvordan spillet fungerer nå:

Gå videre til siste del av serien for å se hvordan det hele ender opp.

Relaterte innlegg

4 kommentarer om “Et spill blir skapt (del 3)

Legg inn en kommentar

Dette nettstedet bruker Akismet for å redusere spam. Lær om hvordan dine kommentar-data prosesseres.