Benutzer:Berni/Rastertrick/Optimierte Grafik bei Multicolor-Sprites
Aus C64-Wiki
Zur Navigation springenZur Suche springenMulticolor-Sprites haben den Nachteil, dass die Sprite-Pixel immer zwei Bildschirm-Pixel breit sind. Das führt schnell zu blockartigen Grafiken. Je nach Motiv kann man dies abmildern, indem man einzelne Zeilen des Sprites um einen Bildschirm-Pixel nach rechts (oder links) verschiebt.
Diesen Trick kann man auch bei (einfarbigen) Sprites nutzen, die in X-Richtung vergrößert wurden.
Im nachfolgenden Programm wurde jede Verschiebung um 1 Pixel von Hand durchgeführt, damit der Umgang mit den Badlines einfacher wird. Es sollte aber auch möglich sein, dies in einer Schleife zu machen.
*=$c000 lda #00 ; Hintergrund schwarz sta $d020 sta $d021 lda #99 ; Sprite initialisieren sta $d001 lda #1 sta $d010 sta $d015 sta $d01c lda #7 sta $d025 lda #2 sta $d026 lda #8 sta $d027 lda #13 sta 2040 ldx #62 - lda .sprite,x sta 832,x dex bpl - sei lda #102 ; Interrupt auf Zeile 102 sta $d012 ; programmieren lda $d011 and #$7f sta $d011 lda $d01a ; Rasterzeilen-Interrupt anschalten ora #$01 sta $d01a lda #<irq ; Interrupt-Routine verbiegen sta $0314 lda #>irq sta $0315 cli rts irq lda $d019 ; Auf VIC-Interrupt testen bmi vic_irq lda $dc0d ; Timer-Interrupt bestätigen cli ; und neuen Interrupt zulassen jmp $ea31 ; System-Interrupt vic_irq ldy #51 ; X-Koordinate 307 ldx #50 ; X-Koordinate 306 - lda $d012 ; Auf Zeile 103 warten cmp #103 bne - sty $d000 - lda $d012 ; Auf Zeile 104 warten cmp #104 bne - stx $d000 - lda $d012 cmp #105 bne - sty $d000 - lda $d012 ; Eigentlich ändert sich hier nichts, cmp #106 ; aber dies wird für das korrekte Timing bne - ; der nachfolgenden Badline benötigt sty $d000 ; badline !for i, 1, 20 { nop ; Mit 20x nop auf Zeile 107 warten } stx $d000 - lda $d012 cmp #114 bne - sty $d000 - lda $d012 cmp #116 bne - stx $d000 - lda $d012 cmp #117 bne - sty $d000 - lda $d012 cmp #118 bne - stx $d000 lda $d019 ; Rasterzeilen-Interrupt bestätigen sta $d019 pla ; Interrupt geordnet beenden tay pla tax pla rti ; Sprite-Daten .sprite !by 0,85,0,1,170,64,6,170,144,26,170,144,26,234,164 !by 107,235,164,107,235,164,106,234,169,106,170,169 !by 106,170,169,106,170,169,110,170,169,110,170,185 !by 106,174,185,106,190,164,106,190,164,26,174,164 !by 26,170,144,6,170,144,1,170,64,0,85,0