Ready64 Forum
Commodore 64 => Programmazione, Grafica e Musica => Topic aperto da: Tremal-Naik - 14 Agosto 2004, 23:10:30
-
Avrei bisogno di ottenere un piccolo effetto parallattico su uno scrolling tipo la schermata introduttiva di Creatures (in particolare le nuvolette). Diciamo che non ci sono problemi per le nuvole in primo piano (smooth scroll di una sola riga: e' alla mia portata :)), ma come mi comporto per quelle in secondo piano che vanno piu' lente?
-
Ciao!
Per quelle in secondo piano potresti usare degli sprites, in modo da avere così l'effetto "sovraimpressione" di cui hai bisogno. Puoi fare anche i caratteri in secondo piano e gli sprites in primo naturalmente, basta settare la priorità di visualizzazione degli sprites opportunamente.
-
Per quelle in secondo piano potresti usare degli sprites, in modo da avere così l'effetto "sovraimpressione" di cui hai bisogno
Ci avevo pensato ma volevo provare a fare tutto tramite caratteri (piu' che altro come esercizio). Il mio problema in realta' e' quello di ottenere uno scroll piu' lento o piu' veloce ma sempre fluido...
-
Dovresti dividere lo schermo in due parti (tramite raster interrupt) e fare uno scrolling hardware/software di 1pixel in alto e 2 pixel in basso (o comunque 1:3, 2:3, 2:4, ecc).
bye
S.T.
-
Dovresti dividere lo schermo in due parti (tramite raster interrupt) e fare uno scrolling hardware/software di 1pixel in alto e 2 pixel in basso (o comunque 1:3, 2:3, 2:4, ecc).
Quindi mentre le nuvolette che stanno in primo piano (quindi quelle piu' veloci) le scrollo in modo semplice (scroll di 8 pixel via VIC e d016 e poi scroll di un carattere nella direzione che mi interessa via software) quelle in secondo piano, piu' lente, le scrollo di un pixel ogni 3 pixel scrollati... Domani ci provo! Spero solo che l'effetto sia abbastanza fluido...
-
Si, questa mi sembra la strada che farei per realizzare ciò.
Non ho comunque mai analizzato codice che lo utilizzi, quindi solo provandoci si può vedere se risulta fluido.
-
Eccolo qui! Con gli sprite avrei fatto decisamente prima ma volevo provare ad impazzire un po' con i raster e lo scroll del VIC. Il risultato mi sembra abbastanza fluido...
processor 6502
org $0800
dc.b $00, $01, $08, $0a, $00
dc.b $9e, $20, "2304"
dc.b $00, $00, $00
org $0900
sei
lda #$0e
jsr $e536
; Disegno le nuvole
lda #$04
sta $0427
sta $0426
sta $0425
sta $0424
lda #$01
sta $049f
sta $049e
ldx #$00
print_text
lda text,x
sta $0753,x
inx
cpx #end_text-text
bne print_text
; Inizializzo i 3 stati utili dello scroll: scroll di default e
; scroll della prima e seconda nuvola
lda $d016
sta default_scroll
and #%11110111
ora #%00000111
sta cloud1_scroll
sta cloud2_scroll
; ----------------------------------------------------------------------
; Scroll della prima nuvola
; ----------------------------------------------------------------------
main
lda #$20
wait_020
cmp $d012
bne wait_020
ldx $d011
bmi wait_020
lda cloud1_scroll ; Se no recupero il valore di $d016 per
sta $d016 ; la prima nuvola
dec cloud1_scrollstat ; E' ora di eseguire lo scroll software?
beq swscroll_cloud1
dec $d016
inc speed_clouds2 ; Comunico alla seconda nuvola che la prima
lda $d016 ; ha scrollato di 1 pixel
sta cloud1_scroll ; Per finire memorizzo lo scroll della nuvola
jmp end_scroll1
swscroll_cloud1
lda $0400 ; Se si' scrollo la riga di un carattere
pha ; a sinistra
ldx #$00
scroll_1row
lda $0401,x
sta $0400,x
inx
cpx #$27
bne scroll_1row
pla
sta $0427
; Risistemo le variabili di controllo e lo stato dello scroll
lda #$08
sta cloud1_scrollstat
lda $d016
ora #%00000111
sta $d016
sta cloud1_scroll
end_scroll1
; ----------------------------------------------------------------------
; Scroll della seconda nuvola
; ----------------------------------------------------------------------
lda #$3b
wait_03b
cmp $d012
bne wait_03b
ldx $d011
bmi wait_03b
; Come nel raster precedente inizializzo lo scroll della seconda nuvola
; allo stato precedente
lda cloud2_scroll
sta $d016
; E' ora di fare uno scroll?
lda speed_clouds2
and #%00000001
beq no_scroll
; Se si' procedo come con la prima nuvola
lda #$00
sta speed_clouds2
dec cloud2_scrollstat
beq swscroll_cloud2
dec $d016
lda $d016
sta cloud2_scroll
jmp no_scroll
swscroll_cloud2
lda $0478
pha
ldx #$00
scroll_3row
lda $0479,x
sta $0478,x
inx
cpx #$27
bne scroll_3row
pla
sta $049f
lda #$08
sta cloud2_scrollstat
lda $d016
ora #%00000111
sta $d016
sta cloud2_scroll
no_scroll
; ----------------------------------------------------------------------
; Tutto quello che sta dopo il raster $0a9 non deve scrollare
; ----------------------------------------------------------------------
lda #$a9
wait_0a9
cmp $d012
bne wait_0a9
ldx $d011
bmi wait_0a9
lda default_scroll
sta $d016
jmp main
rts
default_scroll ds.b 1
cloud1_scroll ds.b 1
cloud2_scroll ds.b 1
cloud1_scrollstat dc.b 8
cloud2_scrollstat dc.b 8
speed_clouds2 dc.b 0
text dc.b 20, 5, 24, 20, 32, 16, 1, 18, 1, 12, 12, 1, 24, 32, 4, 5, 13, 15
end_text
-
Ottimo lavoro!