AmigaCommodoreprogrammering

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.

Space'94 (Amiga, 1994)

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).
Space'94 (Amiga, 1994)
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.

 

Legg igjen kommentar