Et spill blir skapt (del 4)

Det begynte som en enkel test, og nå har det blitt et «skikkelig» spill. Testet på barn, og alt!

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

En ordentlig struktur

Slik er spillet nå.
Slik er spillet nå.

Da jeg ga meg sist, hadde jeg et fungerende spill, komplett med enkle animasjoner, score, og muligheten for å vinne. Det er veldig enkle saker, men det funker, og det ser faktisk ikke så rent ille ut, heller. Plattformens begrensninger tatt i betraktning, altså.

Men det å skyte 10 UFO-er, er ikke spesielt vanskelig. Så for at dette spillet skal fungere mer enn én gang, må jeg gjøre det litt mer avansert. Som dere kanskje husker, bruker jeg MUSIC-kommandoen for å time bevegelsen til UFO-en. Jeg tegner en UFO på skjermen, spiller en note, og så stryker jeg UFO-en fra skjermen og gjentar samme prosess på neste skjermposisjon. Nå som jeg har oppdaget TEMPO-kommandoen, som lar meg bestemme hvor lang tid noten skal spille, kan jeg utnytte denne til å øke vanskelighetsgraden.

Kort sagt, legger jeg inn tre «brett», eller «waves», i spillet. Når du har drept ni UFO-er, går spillet over til neste brett, der UFO-ene nå beveger seg raskere (på grunn av at jeg har økt tempoet med TEMPO-kommandoen). Når du har drept 18, går hastigheten nok en gang opp. Og når du har drept 29, møter du «sistebossen» – som har det raskeste tempoet og derfor er vanskeligst å drepe. I forbindelse med denne endringen, har jeg også lagt inn en teller i bunnen av skjermen, som forteller spilleren hvilken WAVE han eller hun er på.

Jeg har forøvrig også lagt inn «high score», som seg hør og bør i et arkadespill. Men dette fant jeg ikke plass til i selve spillskjermbildet, så den vises kun på tittelskjermen (sammen med «last score»).

Alle gode spill starter med en stor logo

Man må jo vite hvem som har laget spillet!
Man må jo vite hvem som har laget spillet!

Det neste jeg gjør, er det viktigste av alt – jeg legger inn en fancy intro-animasjon der teksten Spillhistorie.no skrives i store bokstaver på skjermen når spillet starter. Dette gjør jeg ved hjelp av SET-kommandoen, som du kanskje husker jeg også brukte til å tegne bakgrunnslandskapet i spillet. Jeg skal ikke gå gjennom maskinens pseudografikk-system igjen (les del 1), men kort sagt lar SET-kommandoen meg tegne veldig store «piksler» på skjermen. Kommandoen SET 13,21 tegner opp en piksel på koordinatene 13,21.

Read og DataREAD og DATA

Ved hjelp av DATA-kommandoen kan jeg legge inn «data» i et program, som så kan leses ved hjelp av READ-kommandoen. Eksempel:

10 READ A
20 PRINT A
40 IF A=10 THEN END
50 GOTO 10
60 DATA 1,2,3,4,5,6,7,8,9,10

Når jeg kjører dette programmet, vil resultatet bli at tallene 1-10 skrives på skjermen.

READ-kommandoen i linje 10 leser fra DATA-kommandoen i linje 60, og begynner med den første «dataen» som ikke tidligere har blitt lest (i første omgang, 1). Så legges verdien inn i A-variabelen, og den skrives på skjermen i linje 20. I linje 30 sier jeg at programmet skal avsluttes, om verdien i A er 10. Såfremt denne betingelsen ikke er nådd, vil GOTO-kommandoen i linje 50 sende programmet tilbake til linje 10, der READ-kommandoen nå vil lese inn verdien 2 (siden 1 allerede er brukt). Og så videre.

Hvis jeg hadde lagt inn RESTORE-kommandoen et sted i koden, så hadde jeg fortalt datamaskinen at den skulle gå tilbake til starten av DATA-mengden (altså i dette tilfellet begynne på 1 igjen).

For å skrive «Spillhistorie.no» ved hjelp av SET, må jeg legge inn mange koordinater. Hver bokstav blir fem «piksler» høy, og opp til tre «piksler» bred. En S krever på denne måten 11 «piksler», altså 11 SET-kommandoer. Det blir veldig plasskrevende, men jeg kan bruke READ og DATA-kommandoene for å legge det inn litt mer effektivt. Se boksen på siden.

I koden min skriver jeg inn alle koordinatverdiene som DATA, og leser to av gangen. Så brukes disse i SET-kommandoen for å tegne en prikk på skjermen. Prosessen gjentas ved hjelp av en FOR NEXT-sløyfe (se del 3), helt til alle prikkene er tegnet inn.

Når hele navnet er skrevet på skjermen, bruker jeg en FOR NEXT-sløyfe kombinert med PRINT-kommandoen og for å få navnet til å «skrolle» opp og ut av skjermen. Det er den absolutt enkleste måten å implementere vertikal skrolling på, men det funker. Når navnet har skrollet ut av skjermen, vises tittelskjermen.

Slutt å spise landskapet mitt!

Nå er spillet sånn cirka ferdig, men jeg må fikse én liten ting: Både UFO-en og kula har en tendens til å fjerne landskapet når de beveger seg over det. Det er fordi at når jeg flytter UFO-en og kula til neste punkt på skjermen, erstattes de med tegnet for mellomrom – og det skjer uansett hva som tidligere befant seg der.

Ved hjelp av PEEK-kommandoen kan jeg imidlertid endre dette. For hvert hakk i animasjonene, legger jeg inn en PEEK-kommando som leser inn verdien den skjermposisjonen UFO-en og kula skal til å overskrive allerede har. Hvis skjermposisjonen er tom, betyr det at verdien 0 leses inn. Men hvis den for eksempel har en bit med landskap i seg, blir verdien en annen. Når verdien så er lagret i en variabel, kan jeg i stedet for å POKE verdien 0 inn når jeg skal fjerne UFO-en igjen, heller POKE inn verdien av variabelen – og dermed tegne opp igjen det som var der før.

Det obligatoriske Sharp-bildet.
Det obligatoriske Sharp-bildet.

Denne endringen gir meg også mulighet til å gjøre spillet enda litt «finere», ved å tegne opp noen stjerner på himmelen. Jeg kunne selvsagt ha gjort det tidligere, men da ville de altså blitt fjernet etter hvert som UFO-en beveget seg over dem – og det hadde jo sett litt dumt ut. Jeg legger inn et tilfeldig antall mellomrom mellom hver stjerne, slik at himmelen (i likhet med landskapet) blir ulik hver gang man spiller.

Dermed er spillet ferdig! Det er noen småtterier som må fikses, slik som å bruke GET i stedet for INPUT når jeg leser inn vanskelighetsgraden (det er bare litt proffere sånn), men ellers er ting generelt som de skal være – og jeg kan gå videre til mitt neste prosjekt! Under kan du se en video av det ferdige spillet.

Det er gøy å lage spill

Jeg er klar over at Astro Attackers ble et veldig enkelt spill – det er litt artigere enn en kanskje skulle tro, men det er ikke snakk om noen veldig avanserte saker. Samtidig er det nok ganske representativt for den typen hjemmesnekrede spill det kom tusenvis av på åttitallet, og hvis du kommer opp med et viktig navn fra spillindustrien på åtti- og nittitallet, er sjansene store for at han eller hun startet med å utvikle spill som dette, gjerne i BASIC.

Dette spillet holder jeg på med nå. Jeg har laget tre andre, i tillegg til Astro Attackers.
Dette spillet holder jeg på med nå. Jeg har laget tre andre, i tillegg til Astro Attackers.

Det jeg forhåpentligvis har klart å vise, er hvor lett det var å komme i gang, og skape noe. Jeg hadde den fordelen at jeg kunne spørre Ben Coffer om råd, og at jeg har litt mer peiling på spill enn det åttitallets hobbyprogrammerere hadde (rett og slett fordi jeg har hatt flere tiår til å lære om dem), men ellers er situasjonen i stor grad den samme som den var for en ny eier av en mikrodatamaskin tidlig på åttitallet. Det jeg kanskje også har klart å vise, er at dette er moro. Selv i sin aller enkleste form, er det å skape noe som kan spilles en kul utfordring, som har hektet meg mer enn noe nytt spill har klart i de siste månedene.

Og så er det faktisk ganske tilfredsstillende – da Ben Coffer lot sønnen prøve spillet, og fortalte at han fortsatte å snakke om min «alien boss» i lang tid etter at det var avsluttet, kunne jeg ikke annet enn å smile. Jeg har skapt et spill som aldri har eksistert før, og som har gitt et annet menneske glede. Det er litt gøy.

Så poenget er: Lag et spill i dag! Jeg tviler på at du vil angre. :)

Oppdatering: Jeg fortsatte å programmere på Sharp, og endte opp med et spill vi faktisk har solgt på kassett. Følg også den lenken for å få tak i den ferdige utgaven av Astro Attackers.

En kommentar om “Et spill blir skapt (del 4)”

Legg inn en kommentar

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