RETRO KUTAK – tehnologija prošlih decenija

C64 – Cake 7: Animacija sprajtova (pravci kretanja + sudar)

Dobrodošli u nove cake. Danas ćemo videti kako animirati sprajtove. Uradićemo primer sprajta koji će menjati svoj izgled u zavisnosti u kom pravcu se kreće, kao i u slučaju da se sudari sa pozadinom.

Poslušajte audio recenziju ovog teksta:

Kod svih arkadnih video igrica privlačnost istih za igrača je osim grafike, lepo urađenih sprajtova i muzike, odnosno zvučnih efekata, i animacija sprajtova čime igra mnogo dobija na zanimljivosti i dinamici.

Glavni način animacije sprajta je jednostavno prepisivanje memorijskih lokacija istih različitim izgledima u zavisnosti od situacije.

U vezi sa ovim uzećemo deo asemblerskog programa koga smo objavili u ranijim lekcijama i prilagoditi isti sa drugim izgledom sprajta koji će menjati izgled u skladu sa pokretima koje mu budemo zadali.

Primer asemblerskog koda


* = $1000

lda #147        ; Unosimo decimalnu vrednost 147 (CLR SCR)
jsr $ffd2       ; Pozivamo sistemski podprogram za prikaz karaktera

lda #8          ; Narandžasta boja
sta $d020       ; Boja okvira
sta $d021       ; Boja pozadine

lda #0          ; Čistimo akumulator
sta $d010       ; Resetujemo 9. bit X koordinate za sve sprajtove
ldx #0          ; Praznimo X registar
ldy #0          ; Praznimo Y registar
lda #0          ; Praznimo A registar

sta $0500       ; Postavljamo karakter "@" na ekran (prepreka)
sta $0510       ; Postavljamo još jedan "@"

ldx #0
jsr spr         ; Podprogram za aktiviranje glavnog izgleda sprajta

lda #$0d        ; Blok 13
sta $07f8       ; Pokazivač za prvi sprajt (blok 13)

lda #$01        ; Uključi sprajt 0
sta $d015       ; Enable registar
sta $d01c       ; Multicolor enable za sprajt 0

lda #$70        ; Početna X koordinata
sta $d000
sta $d001       ; Početna Y koordinata

lda #$01        ; Bela
sta $d025       ; MC boja 1 (shared)
lda #$02        ; Crvena
sta $d026       ; MC boja 2 (shared)
lda #$03        ; Svetlo plava
sta $d027       ; Pojedinačna boja sprajta 0

; --- GLAVNA PETLJA ---
upravljanje
lda $d01f       ; Očitavamo sudar (da resetujemo bag detekcije)
jsr uspori      ; Pozivamo usporavanje
jsr sudar       ; Provera sudara

ldx 197         ; Očitavanje tastature
cpx #10         ; Taster 'A'?
beq levo        ; Idi levo
cpx #18         ; Taster 'D'?
beq desno       ; Idi desno
cpx #9          ; Taster 'W'?
beq gore        ; Idi gore
cpx #13         ; Taster 'S'?
beq dole        ; Idi dole

ldx #0
jsr spr         ; Ako ništa nije pritisnuto, vrati glavni izgled
jmp upravljanje ; Beskonačna petlja

; --- SKOKOVI ---
levo
jmp smanjix
desno
jmp uvecajx
gore
jmp smanjiy
dole
jmp uvecajy

; --- KRETANJE ULEVO ---
smanjix
ldx #0
jsr splev       ; Učitaj izgled "levo"
dec $d000       ; Smanji X koordinatu
lda $d010       ; Proveri 9. bit
and #%00000001
cmp #1
beq proverix    ; Ako je 9. bit setovan, idi na proveru
ldx $d000
cpx #14         ; Da li je ivica ekrana?
beq stanix      ; Blokiraj kretanje
jmp upravljanje

proverix
ldx $d000
cpx #0          ; Da li smo stigli do 0 (prelaz u niži bajt)?
beq resetujx
jmp upravljanje

resetujx
lda $d010
and #%11111110  ; Resetuj 9. bit sprajta 0
sta $d010
lda #255        ; Postavi X na 255
sta $d000
jmp upravljanje

stanix
lda #15         ; Zadrži na ivici
sta $d000
jmp upravljanje

; --- KRETANJE UDESNO ---
uvecajx
ldx #0
jsr spldes      ; Učitaj izgled "desno"
inc $d000       ; Povećaj X
beq setujx      ; Ako je prešlo 255, setuj 9. bit
lda $d010
and #%00000001
cmp #1
beq proveri     ; Ako je 9. bit setovan, proveri ivicu
jmp upravljanje

setujx
lda $d010
ora #%00000001  ; Setuj 9. bit sprajta 0
sta $d010
jmp upravljanje

proveri
ldx $d000
cpx #71         ; Desna ivica (uz setovan 9. bit)
beq stanix2
jmp upravljanje

stanix2
lda #70         ; Blokiraj kretanje
sta $d000
jmp upravljanje

; --- KRETANJE GORE/DOLE ---
smanjiy
ldx #0
jsr spgor       ; Učitaj izgled "gore"
dec $d001       ; Smanji Y
jmp upravljanje

uvecajy
ldx #0
jsr spdol       ; Učitaj izgled "dole"
inc $d001       ; Povećaj Y
jmp upravljanje

; --- USPORAVANJE ---
uspori
nop
nop
iny
bne uspori
rts

; --- DEFINICIJE IZGLEDA (Subroutine) ---
spr
lda sprajt,x    ; Glavni izgled
sta 832,x
inx
cpx #63
bne spr
rts

splev
lda sprlevo,x   ; Izgled levo
sta 832,x
inx
cpx #63
bne splev
rts

spdes
lda sprdesno,x  ; Izgled desno
sta 832,x
inx
cpx #63
bne spdes
rts

spgor
lda sprgore,x   ; Izgled gore
sta 832,x
inx
cpx #63
bne spgor
rts

spdol
lda sprdole,x   ; Izgled dole
sta 832,x
inx
cpx #63
bne spdol
rts

spbom
lda sprboom,x   ; Izgled sudar
sta 832,x
inx
cpx #63
bne spbom
rts

; --- PODACI O IZGLEDU (Data) ---
sprajt
.byte 0,0,0, 2,170,128, 10,170,160, 47,255,248, 44,0,56
.byte 44,0,56, 45,65,120, 45,65,120, 45,0,120, 44,60,56
.byte 44,60,56, 44,60,56, 44,0,56, 44,0,56, 44,85,56
.byte 44,20,56, 44,0,56, 44,0,56, 11,255,224, 2,170,128, 0,0,0

sprlevo
.byte 0,0,0, 2,170,128, 2,170,160, 11,255,248, 8,0,56
.byte 8,0,56, 9,64,56, 9,64,56, 9,0,56, 60,0,56
.byte 60,0,56, 60,0,56, 8,0,56, 8,16,56, 5,64,56
.byte 8,0,56, 10,0,56, 10,0,56, 3,255,224, 2,170,128, 0,0,0

sprdesno
.byte 0,0,0, 2,170,128, 10,170,128, 47,255,224, 44,0,32
.byte 44,0,32, 44,1,96, 44,1,96, 44,0,96, 44,0,60
.byte 44,0,60, 44,0,60, 44,0,32, 44,4,32, 44,1,80
.byte 44,0,32, 44,0,160, 44,0,160, 11,255,192, 2,170,128, 0,0,0

sprgore
.byte 0,0,0, 2,170,128, 10,170,160, 42,170,168, 42,170,168
.byte 42,170,168, 42,170,168, 42,170,168, 42,170,168, 42,170,168
.byte 42,170,168, 42,170,168, 42,170,168, 42,170,168, 11,255,224
.byte 3,255,192, 0,0,0

sprdole
.byte 0,0,0, 2,170,128, 10,170,160, 42,170,168, 42,170,168
.byte 42,170,168, 42,170,168, 42,170,168, 42,170,168, 42,170,168
.byte 42,170,168, 42,170,168, 44,0,56, 45,65,120, 45,65,120
.byte 44,65,56, 44,0,56, 44,0,56, 3,255,192, 0,60,0, 0,60,0

sprboom
.byte 0,0,0, 160,0,0, 136,0,0, 168,192,0, 171,48,0
.byte 139,51,0, 139,60,192, 163,60,192, 3,60,209, 0,204,213
.byte 0,12,213, 0,3,17, 0,0,17, 32,0,17, 8,0,0
.byte 10,1,0, 0,132,64, 0,239,220, 0,0,0, 0,0,0, 0,0,0

; --- SUDAR ---
sudar
lda $d01f       ; Učitaj registar sudara
bne krajsve     ; Ako nije nula (sudar), idi na kraj
rts

krajsve
ldx #0
jsr spbom       ; Prikaži "boom" izgled
pla
pla             ; Skini adresu povratka sa steka (izlaz iz programa)
rts

Prilikom startovanja ovog primera pojaviće se glava čovečuljka koja u stanju mirovanja gleda u nas. Kada se pomeramo na levo, desno, gore, dole ovaj sprajt će saglasno tome menjati svoj izgled. U slučaju da se sudari sa dva karaktera „@“ koja se nalaze na ekranu programski primer će završiti sa radom i sprajt će dobiti izgled sudara (naravno izgled sprajta je daleko od savršenog ali naglašava poentu). Naravno mogu se dodati još animacija po našoj želji, uticati na multikolor boje sprajta, konstantno menjati njegov izgled kada je u stanju mirovanja ili pokreta itd.

Obratite pažnju da u sekciji upravljanje nismo išli preko branch naredbi do sekcija uvećanja i umanjenja X i Y kordinata iz razloga što daljina koda prevazilazi +128 bajtova od mesta branch poziva. Zato smo koristili kratke skokove do mesta gde smo koristili naredbu JMP koja je šesnaestobitna i koja ima pristup svim delovima memorije (mogli smo da koristimo i naredbu JSR koja je takođe šesnaestobitna već zavisno od situacije). Kada prilikom kompajliranja asembler prijavi grešku „branch out of range“ to rešavamo na ovaj način.

Program za razmišljanje

I na kraju kao i uvek dajemo program za razmišljanje:


* = $1000

lda #$ff
sta $d40e
sta $d40f
lda #$80
sta $d412

lda #$0d
sta $07f8

lda #$01
sta $d015
sta $d01c

lda #$71
sta $d000
sta $d001

lda #1
sta $d017
sta $d01d

ponovi
lda $d41b       ; Učitaj random vrednost iz SID oscilatora
sta $d025
lda $d41b
sta $d026
lda $d41b
sta $d027

ldx #0
opet
lda $d41b
sta 832,x       ; Piši random bajtove direktno u opis sprajta
inx
cpx #63
bne opet
jmp ponovi

Mala pomoć: ima veze sa slučajnosti i izgleda sprajta.

To je sve za danas.
Veliki pozdrav!

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *