Benutzer:Berni/Rastertrick/Optimierte Grafik bei Multicolor-Sprites

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Multicolor-Sprite mit Zeilen, die um ein Pixel versetzt sind.

Multicolor-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