RETRO KUTAK – tehnologija prošlih decenija

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

Datu objavljivanja: 25.10.2025.

Autore: Saša Petrović

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

Preslušajte audio recenziju ovog teksta:

Dobrodošli u nove cake. Danas ćemo videti kako animirati sprajtove. Uradićemo primer sprajta koji menja izgled u zavisnosti od pravca kretanja, kao i u slučaju sudara sa pozadinom.

Kod svih arkadnih igrica šarm leži i u grafici, lepo urađenim sprajtovima, muzici/zvuku i — naravno — animacijama sprajtova, koje igri daju dinamiku. Glavni princip animacije je prepisivanje memorije opisa sprajta drugim izgledom u datom trenutku.

Uzećemo deo asemblerskog programa iz lekcije „C64 Asembler – lekcija 7“ i prilagoditi ga tako da sprajt menja izgled u skladu sa zadatim pokretima.

Primer koda

; C64 – Cake 7: animacija sprajta po pravcu + sudar
* = $1000
lda #147        ; PETSCII CLS
jsr $ffd2

lda #8
sta $d020       ; border
sta $d021       ; background

lda #0
sta $d010       ; reset 9. bit X za sve sprajtove

ldx #0
ldy #0
lda #0

sta $0500       ; prepreka: karakter "@"
sta $0510

ldx #0
jsr spr         ; učitaj glavni izgled sprajta

lda #$0d
sta $07f8       ; opis prvog sprajta u bloku 13 (832–13*64)

lda #$01
sta $d015       ; enable sprite 0
sta $d01c       ; multicolor enable sprite 0

lda #$71
sta $d000       ; X0
sta $d001       ; Y0

lda #$01
sta $d025       ; mc shared color 01 (bela)
lda #$02
sta $d026       ; mc shared color 11 (crvena)
lda #$03
sta $d027       ; mc unique color 10 za sprite 0 (svetlo plava)

upravljanje
lda $d01f       ; "prime" bug detekcije sudara (reset očitavanjem)
jsr uspori
jsr sudar

ldx 197         ; keyboard buffer
cpx #10         ; 'A' -> levo
beq levo
cpx #18         ; 'D' -> desno
beq desno
cpx #9          ; 'W' -> gore
beq gore
cpx #13         ; 'S' -> dole
beq dole

ldx #0
jsr spr         ; vrati glavni izgled
jmp upravljanje

levo
jmp smanjix
desno
jmp uvecajx
gore
jmp smanjiy
dole
jmp uvecajy

; --- LEVO: smanji X, obrni izgled ---
smanjix
ldx #0
jsr splev
dec $d000
lda $d010
and #%00000001
cmp #1
beq proverix
ldx $d000
cpx #14
beq stanix
jmp upravljanje

proverix
ldx $d000
cpx #0
beq resetujx
jmp upravljanje

resetujx
lda $d010
and #%11111110
sta $d010
lda #255
sta $d000
jmp upravljanje

stanix
lda #15
sta $d000
jmp upravljanje

; --- DESNO: uvećaj X, obrni izgled ---
uvecajx
ldx #0
jsr spldes
inc $d000
beq setujx
lda $d010
and #%00000001
cmp #1
beq proveri
jmp upravljanje

setujx
lda $d010
ora #%00000001
sta $d010
jmp upravljanje

proveri
ldx $d000
cpx #71
beq stanix2
jmp upravljanje

stanix2
lda #70
sta $d000
jmp upravljanje

; --- GORE/Dole: menjaj Y i izgled ---
smanjiy
ldx #0
jsr spgor
dec $d001
jmp upravljanje

uvecajy
ldx #0
jsr spdol
inc $d001
jmp upravljanje

; --- Usporavanje petlje ---
uspori
nop
nop
iny
bne uspori
rts

; --- Učitavanje opisa sprajta (glavni/varijante) ---
spr
lda sprajt,x
sta 832,x
inx
cpx #63
bne spr
rts

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

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

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

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

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

; --- Opisi sprajta (63 bajta) ---
sprajt
.byte 0,0,0
.byte 2,170,128
.byte 10,170,160
.byte 47,255,248
.byte 44,0,56
.byte 44,0,56
.byte 45,65,120
.byte 45,65,120
.byte 45,0,120
.byte 44,60,56
.byte 44,60,56
.byte 44,60,56
.byte 44,0,56
.byte 44,0,56
.byte 44,85,56
.byte 44,20,56
.byte 44,0,56
.byte 44,0,56
.byte 11,255,224
.byte 2,170,128
.byte 0,0,0

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

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

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

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

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

; --- Sudar sa pozadinom ---
sudar
lda $d01f       ; collision sprite/background
bne krajsve
rts

krajsve
ldx #0
jsr spbom
pla
pla
rts

Prilikom starta pojaviće se glava „čovečuljka“ koja u mirovanju gleda ka nama. Kretanje levo/desno/gore/dole menja izgled sprajta. Sudar sa dva „@“ karaktera na ekranu završava primer — sprajt dobija „boom“ izgled. Naravno, možete dodati više animacija, menjati multicolor boje, ili ciklično menjati idle izgled.

Tip: U sekciji upravljanje nismo koristili branch do dalekih etiketa, jer udaljenost prelazi +128 bajtova. Umesto toga koristili smo kratke skokove ka mestima gde izvršavamo JMP (16-bitni). Grešku „branch out of range“ rešavajte ovim pristupom (ili JSR gde ima smisla).

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
sta $d025
lda $d41b
sta $d026
lda $d41b
sta $d027
ldx #0

opet
lda $d41b
sta 832,x
inx
cpx #63
bne opet
jmp ponovi

Mala pomoć: ima veze sa slučajnošću i izgledom sprajta. 😉

To je sve za danas. Veliki pozdrav!

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

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