Programmering i Amos – Space’94
En av tingene jeg likte veldig godt å gjøre på min Amiga 500 på 90-tallet var å programmere. Jeg fikk Amiga Amos på CU Amiga coverdisk 54. Jeg programmerte en god del, prøvde, testa ut og eksperimenterte. Men det var faktisk bare Spacce’94 – en enkel Space Invaders klone – som ble fullført sammen med Basma Soccer.
Jeg brukte faktisk bare tre dager på å lage Space’94 noen påskedager i april 1994. Det betyr at spillet nå er 30 år gammelt i 2024. Spillets distribusjon den gang begrenset seg til to i klassen som fikk hver sin kopi. Jeg var den gang 16 år (nesten 17).
Grafikken i spillet er relativt enkel. Det har fire fiender, et romskip og kule, samt en animert eksplosjon. Lyden i spillet bruker innebygde kommandoer i Amos som Shoot og Boom. Enkle effekter, men det fungerer greit i dette spillet.
Musikken var nok noe jeg lagde i full fart. Det er på ingen måte en god tittel melodi, men kanskje bedre enn ingenting.
Space’94 kan lastes ned fra denne lenken.
Her skal jeg prøve å gjennomgå litt av koden til Space’94. Den baserer seg på (god eller dårlig) hukommelsen, kommentarer og hva jeg husker fra kodinga.
‘|- – – – – – – -| ‘| SPACE’94 | ‘| | ‘| by | ‘| | ‘| FER Design | ‘| | ‘| © 1994 | ‘|- – – – – – – -| ‘ ‘Programmert: 31/3-1994, 1/4-1994, 3/-1994, ‘ Screen Open 0,320,200,16,Lowres : Flash Off : Curs Off : Cls 0 : Hide Get Sprite Palette : Randomize Timer : Paper 0 : Pen 10 Screen Open 1,320,40,16,Lowres : Flash Off : Curs Off : Get Sprite Palette Screen Display 1,128,252,447,297 : Cls 0 : Pen 1 : Paper 0 Screen Open 2,320,200,16,Lowres : Flash Off : Curs Off : Cls 0 Unpack 4 To 2 Screen 0 Double Buffer : Autoback 0 Global X,AX1,AX2,AX3,AX4,AY1,AY2,AY3,AY4,BX,BY,A,V,SCORE,HIGH,TREFF,PO X=160 : BY=184 _HOVED |
Jeg startet de alle fleste programmene mine med en boks med tittelen på programmet, hvem som hadde lagd det – jeg kalte meg FER Design på den tiden – og året det ble lagd. Under her hadde jeg en linje hvor jeg skrev ned datoene jeg skrev på programmet. Space’94 ble altså lagd på tre dager.
Jeg har åpnet hele tre forskjellige skjermer med kommandoen Screen Open med en oppløsning på 320 x 200 og 16 farger. Skjermen er gjort svart og jeg har slått av alt som vises på skjermen som musepila og kursoren.
Med kommandoen Unpack pakker jeg ut tittelgrafikken som kan sees over fra bank 4 (som er lagret sammen med Amos-programmet) til skjerm 2.
Global definarer variabler og gjør innholdet i dem tilgjengelig for hele programmet. Til slutt starter jeg hele greia med prosedyren _HOVED.
Procedure _HOVED Track Play 3 : Track Loop On Do If Key State(69) Then Track Stop : End If Fire(1) Wait 50 : Cls : TREFF=5 Track Stop Screen To Back 2 : Screen Display 2,128,70,447,249 _MAIN End If Wait Vbl Loop End Proc |
Procedure er en veldig kjekk kommando. Den lager sammen med End Proc en avgrenset kodeblokk som ikke kjøres før man ber om det. Og det gjøres ved å skrive et eget definert navn for prosedyren (som må være annerledes enn en allerede eksisterende kommando) og plassere den et sted i koden.
Dette er en enkel og oversiktlig måte å programmere på. Du bryter ned delere av programmet ditt i hovedfunksjoner. Det blir mer oversiktlig og lettere å finne feil. I mitt tilfelle er dette tittelskjermen på spillet mitt. Jeg startet musikk og venter egentlig bare på at skyteknappen skal trykkes. Når det skjer utføres prosedyren _MAIN.
Procedure _MAIN Cls 0 Screen 1 Print At(1,1);”Your score :”;SCORE Print At(1,2);”Todays highest score:”;HIGH Paste Bob 15,20,10 : Print At(5,3);”=”;TREFF Screen 0 Do _MOVE _MOVEALIEN If A=1 : _MOVEBULLET : End If _COL If PO=1 Then _POENG : PO=0 If Key State(69) Then _GAME_OVER Wait Vbl Loop End Proc |
I _MAIN prossedyren har jeg en loop hvor programmet sjekker om spilleren beveger romskipet, beveger fiendene og sjekker om det er kollisjoner mellom de ulike spillelementene.
Procedure _MOVE Bob 10,X,185,10 If Jleft(1) and X>0 Then X=X-2 If Jright(1) and X<293 Then X=X+2 If Fire(1) and A=0 : BX=X+10 : A=1 : Shoot : _MOVEBULLET : End If End Proc |
_MOVE tegner romskipet og sjekker om spilleren trykker høyre eller venstre på joysticken og om skyteknappen er trykket ned.
Procedure _MOVEALIEN If AY1>200 Bob Off 13 AY1=0 : AX1=Rnd(300)+2 Else AY1=AY1+1 End If If AY2>200 Bob Off 14 AY2=0 : AX2=Rnd(300)+4 Else AY2=AY2+2 End If If AY3>200 Bob Off 15 AY3=0 : AX3=Rnd(300)+6 Else AY3=AY3+3 End If If AY4=200 Bob Off 16 AY4=0 : AX4=Rnd(300)+8 Else AY4=AY4+4 End If Bob 13,AX1,AY1,13 Bob 14,AX2,AY2,14 Bob 15,AX3,AY3,15 Bob 16,AX4,AY4,16 End Proc |
Jeg har fire fiender i spillet; en slange, et eple, en planet og en alien. Prossedyren _MOVEALIEN plasserer fienden et tilfeldig sted på toppen av skjermen og beveger nedover skjermen. Kommer den til bunnen av skjermen, tildeles den et nytt tilfeldig sted på toppen av skjermen.
Procedure _MOVEBULLET If A=1 BY=BY-6 If BY<-12 A=0 End If End If Bob 12,BX,BY,12 If A=0 Bob Off 12 BX=0 : BY=184 End If End Proc |
Det er viktig å skyte fiendene dine, så det tar denne prossedyren seg av.
Procedure _COL If Bob Col(12,13 To 16) For Z=13 To 16 If Bob Col(12,Z To Z) Bob Off Z : Bob Off 12 A=0 : _EKSPLOSJON : BY=184 If Z=13 : AY1=0 : AX1=Rnd(300)+2 : SCORE=SCORE+10 : PO=1 : End If If Z=14 : AY2=0 : AX2=Rnd(300)+4 : SCORE=SCORE+20 : PO=1 : End If If Z=15 : AY3=0 : AX3=Rnd(300)+8 : SCORE=SCORE+30 : PO=1 : End If If Z=16 : AY4=0 : AX4=Rnd(300)+16 : SCORE=SCORE+50 : PO=1 : End If If SCORE>HIGH : HIGH=SCORE : End If End If Next Boom End If If Bob Col(10,13 To 16) For Z=13 To 16 If Bob Col(10,Z To Z) Bob Off Z : Bob Off 10 : Boom If Z=13 : AY1=0 : AX1=Rnd(300)+2 : X=160 : TREFF=TREFF-1 : PO=1 : End If If Z=14 : AY2=0 : AX2=Rnd(300)+4 : X=160 : TREFF=TREFF-1 : PO=1 : End If If Z=15 : AY3=0 : AX3=Rnd(300)+8 : X=160 : TREFF=TREFF-1 : PO=1 : End If If Z=16 : AY4=0 : AX4=Rnd(300)+16 : X=160 : TREFF=TREFF-1 : PO=1 : End If If TREFF=0 : _GAME_OVER : End If End If Next End If End Proc |
Prosedyren _COL skjekker om det er kollisjoner med de forskjellige spritene i spillet og gir poeng etter hva du treffer og trekker fra et liv om du blir truffet.
Procedure _EKSPLOSJON Amal Off 1 A$=” Anim 1,(1,1)(2,2)(3,2)(4,2)(5,3)(6,3)(7,3)(8,3)(9,3)(8,2)(7,2)(6,2)(5,2)(4,1)(3,1)(2,1)(1,1)(17,1)” Bob 1,BX-10,BY-10,1 Channel 1 To Bob 1 Amal 1,A$ : Amal On 1 End Proc |
Jeg lagde en egen prosedyre som spiller av animasjonen for eksplosjonen. Amos har et helt eget språk for dette kalt Amal.
Procedure _POENG Screen 1 Print At(1,1);”Your score :”;SCORE Print At(1,2);”Todays highest score:”;HIGH Print At(5,3);”=”;TREFF Screen 0 End Proc |
Prosedyren _POENG oppdaterer poengsummen du har. Dette skjer faktisk på en helt egen skjerm og ikke den hvor selve spillinga foregår på.
Procedure _GAME_OVER Bob 18,80,50,18 Bell : Wait 50 : Bell : Wait 30 AY1=0 : AY2=0 : AY3=0 : AY4=0 SCORE=0 : BY=184 : BX=X+10 Screen 1 : Cls 0 : Screen 0 : Bob Off Screen Display 2,128,42,447,297 Screen To Front 2 _HOVED End Proc |
Og til slutt er det _GAME_OVER. Skjermen nullstilles og går tilbake til tittelskjermen som faktisk har lagt bak spillskjermen hele tiden.
Aktuelle innlegg:
- Jostein Basma Soccer - Mitt eget fotballspill (100%)
- Anmeldelse: Cannon Fodder - Amiga Format Christmas Special (Amiga, 1994) (39.1%)
- Anmeldelse: Winter Olympics - Lillehammer'94 (Commodore Amiga, 1994) (39.1%)
- Fra akrivet: Space’94 – Mitt Amiga spill (39.1%)
- Anmeldelse: Lotus Turbo Challenge 2 (Amiga, 1991) (35.3%)