Autore Topic: Effetto Dissolvenza  (Letto 2034 volte)

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Effetto Dissolvenza
« il: 30 Luglio 2006, 13:33:34 »
 Era da molto tempo che mi chiedevo come avessero fatto i programmatori di "Grand Prix Circuit" a creare quel bellissimo effetto dissolvenza nelle schermate introduttive.

Neanche mi era passato per la testa,ma la tecnica usata è davvero semplice:in pratica si dispongono 7 sprite espansi orizzontalmente per coprire 21 linee di schermo alla volta,e usando le interruzioni del rastrello si copre tutto lo schermo di sprite.

Siccome gli sprite inizialmente sono vuoti (cioè composti da byte $0) si vede tutto ciò che è in background.Riempiendoli mano a mano con bit 1 scompare gradualmente tutto ciò che gli sta sotto (bitmap o testo chessìa);viceversa per la risolvenza.

Il difficile sta nel randomizzare bene lo riempimento in modo da creare un effetto suggestivo :)

A questo proposito,non conoscendo io nulla di algoritmi grafici ho pensato bene di rabbare le routine,le tabelle di randomizzazione e di masking direttamente dal gioco :D  (per una giusta causa però...).

Battete il solito SYS 49152 e guardate che succede. :)

Codice: [Seleziona]
ptr = $7f8
shp = $f00
yc  = $d001
xc  = $d000
col = $d027
xexp = $d01d
hx = $d010
on = $d015
off = $02
irqv = $314

;-------------------------------

* = $c000

jsr init

lda #$30
sta off
lda #$7f
sta $dc0d      ;interrupt out
lda #<irq
sta irqv
lda #>irq
sta irqv+1     ;dirotta IRQ
lda $d011
and #$7f
sta $d011
lda #$33
sta $d012
lda #1
sta $d01a      ;raster in

;----- routines principali -----

;copyright di "Grand Prix Circuit" ^_^

;-------- DISSOLVENZA ----------

again

jsr delay
ldx #7

mainlp1

stx $03
lda mask,x
sta $fb
ldy #0

nlp1

ldx data,y
lda shp,x
ora $fb
sta shp,x
ldx #12
dex
bne *-1
asl $fb
bcc next1
sec
rol $fb

next1

iny
bne nlp1
ldx $03
dex        
bpl mainlp1

;--------- RISOLVENZA ----------

jsr delay
ldx #7

mainlp2

stx $03
lda mask+8,x
sta $fb
ldy #0

nlp2

ldx data,y
lda shp,x
and $fb
sta shp,x
ldx #12
dex
bne *-1
sec
rol $fb
bcs next2
asl $fb

next2

iny
bne nlp2
ldx $03
dex        
bpl mainlp2

jmp again

;--------- ritardo -------------

delay

tya
pha
txa
pha
ldx #255
ldy #255
dex
bne *-1
dey
bne *-4
pla
tax
pla
tay
rts

;------ inizializzazione -------

init

ldx #6         ;usa 7 sprite

lp1

lda map,x      ;mappe @ 3840
sta ptr,x
dex
bpl lp1

ldx #0
txa            ;vuoto

lp2

sta shp,x
inx
bne lp2

ldx #12
lda #48        ;y

lp3

sta yc,x
dex
dex
bpl lp3

ldx #12
ldy #6         ;x

lp4

lda xs,y
sta xc,x
dey
dex
dex
bpl lp4

ldx #6
txa            ;blu

lp5

sta col,x
dex
bpl lp5

lda #$60
sta hx

lda #127
sta xexp       ;espansione

lda #127
sta on         ;attiva sprite
rts

;-------------------------------

irq

lsr $d019

clc
lda off
cmp #$ed
bne skip

ldy ptr        ;ad ogni quadro scambia
lda ptr+1      ;le mappe per creare
sta ptr        ;l'effetto "breeze"
lda ptr+2
sta ptr+1
lda ptr+3
sta ptr+2
lda ptr+4
sta ptr+3
lda ptr+5
sta ptr+4
lda ptr+6
sta ptr+5
sty ptr+6

lda #$15

skip

adc #$15       ;+21 linee

refr

sta yc
sta yc+2
sta yc+4
sta yc+6
sta yc+8
sta yc+10
sta yc+12
sta off

adc #$03
sta $d012      ;prox IRQ

jmp $ea31

;-------------------------------

map

.byte 60,62,60,61,63,62,61

xs

.byte 24,72,120,168,216,8,56

;-- copyright di "Grand Prix Circuit" ^_^ --

mask

.byte $20,$04,$80,$02,$08,$40,$01,$10
.byte $df,$fb,$7f,$fd,$f7,$bf,$fe,$ef

data

.byte $5e,$e7,$58,$5d,$85,$6b,$04,$76
.byte $43,$a4,$da,$b0,$c3,$52,$a2,$77
.byte $d2,$15,$2d,$4d,$2a,$1d,$a5,$90
.byte $2c,$19,$33,$6a,$1e,$28,$44,$41
.byte $03,$05,$9d,$fe,$87,$c4,$0e,$de
.byte $89,$9a,$46,$7a,$a3,$5a,$88,$02
.byte $0c,$d0,$fa,$54,$12,$db,$aa,$a6
.byte $e9,$80,$a0,$b1,$17,$e8,$bf,$35
.byte $8e,$74,$1b,$94,$f3,$39,$00,$e0
.byte $c2,$3e,$ad,$4c,$6f,$66,$10,$a8
.byte $3b,$6c,$07,$4f,$bd,$71,$63,$9c
.byte $dd,$69,$9f,$81,$f5,$7d,$d4,$bb
.byte $31,$ee,$30,$7b,$d6,$73,$f7,$c5
.byte $d7,$dc,$61,$f9,$ef,$ce,$70,$2e
.byte $40,$bc,$b9,$f1,$ea,$72,$cf,$68
.byte $7f,$fb,$cc,$f0,$22,$3f,$cb,$55
.byte $67,$78,$5b,$8a,$79,$11,$3d,$8c
.byte $57,$50,$1c,$99,$e1,$a7,$7e,$fd
.byte $b7,$34,$9b,$32,$98,$d1,$62,$e4
.byte $7c,$59,$25,$c1,$97,$37,$4b,$df
.byte $47,$b5,$c9,$8b,$c6,$6d,$83,$51
.byte $d8,$93,$09,$ed,$48,$75,$2b,$f2
.byte $b3,$b6,$c8,$d5,$f4,$4e,$a1,$06
.byte $36,$d3,$1f,$c7,$24,$5c,$f8,$b8
.byte $af,$fc,$be,$95,$ba,$56,$3a,$84
.byte $60,$d9,$6e,$cd,$e5,$e2,$20,$92
.byte $e3,$4a,$0a,$f6,$42,$ec,$23,$53
.byte $27,$13,$b2,$2f,$29,$ab,$82,$ca
.byte $16,$0d,$86,$3c,$a9,$9e,$8f,$c0
.byte $ae,$26,$1a,$49,$5f,$91,$18,$08
.byte $96,$8d,$0f,$45,$65,$ac,$eb,$38
.byte $e6,$0b,$64,$01,$21,$b4,$14,$ff

iAN CooG

  • Utente
  • **
  • Post: 1774
    • http://iancoog.altervista.org
  • Gioco Preferito: Turbo Assembler, ActionReplay Monitor, DiskDemon
Effetto Dissolvenza
« Risposta #1 il: 30 Luglio 2006, 14:57:02 »
 Ottimo lavoro di reversing =)
Finora avevo visto alcune routine simili per fare il fadein di bitmaps ma utilizzavano ben 2 bitmap, trasferendo ad esempio da $6000 a $2000 con pattern vari.
-=[]=--- iAN CooG/HVSC^C64Intros ---=[]=-
- http://hvsc.c64.org - http://intros.c64.org -

Alberto

  • Utente
  • **
  • Post: 589
  • Gioco Preferito: Grand Prix Circuit
Effetto Dissolvenza
« Risposta #2 il: 30 Luglio 2006, 21:18:58 »
 Inizialmente anch'io credevo in una cosa del genere,ma poi mi sono accorto che nè la bitmap nè i puntatori alla stessa subivano modifiche:solo a quel punto ho pensato che potessero esserci di mezzo degli sprite.