Autore Topic: Smooth Scrolling - Info  (Letto 1653 volte)

Tremal-Naik

  • Neo-iscritto
  • *
  • Post: 21
  • Gioco Preferito: Turrican
Smooth Scrolling - Info
« il: 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?

MarC=ello

  • Utente
  • **
  • Post: 337
  • Gioco Preferito: CBM BASIC 2.0
Smooth Scrolling - Info
« Risposta #1 il: 15 Agosto 2004, 13:10:07 »
 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.

 
-=MarC=ellO=-

Tremal-Naik

  • Neo-iscritto
  • *
  • Post: 21
  • Gioco Preferito: Turrican
Smooth Scrolling - Info
« Risposta #2 il: 15 Agosto 2004, 16:05:20 »
 
Citazione
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...

ice00

  • Utente
  • **
  • Post: 468
    • http://digilander.iol.it/ice00
Smooth Scrolling - Info
« Risposta #3 il: 15 Agosto 2004, 16:44:44 »
 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.

Tremal-Naik

  • Neo-iscritto
  • *
  • Post: 21
  • Gioco Preferito: Turrican
Smooth Scrolling - Info
« Risposta #4 il: 15 Agosto 2004, 17:03:27 »
 
Citazione
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...

ice00

  • Utente
  • **
  • Post: 468
    • http://digilander.iol.it/ice00
Smooth Scrolling - Info
« Risposta #5 il: 15 Agosto 2004, 20:44:22 »
 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.

Tremal-Naik

  • Neo-iscritto
  • *
  • Post: 21
  • Gioco Preferito: Turrican
Smooth Scrolling - Info
« Risposta #6 il: 16 Agosto 2004, 09:36:28 »
 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...

Codice: [Seleziona]
               
                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

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Smooth Scrolling - Info
« Risposta #7 il: 16 Agosto 2004, 21:43:19 »
 Ottimo lavoro!
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -