Benutzer:Berni/Rastertrick/Spritevergrößerung in X-Richtung

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Ein in X-Richtung vergrößertes Sprite: Es ist fast 100 Pixel breit.

Geeignete Sprites können in X-Richtung gestreckt werden, indem die X-Koordinate für das Sprite in jeder Zeile geändert wird. Dadurch entstehen Sprites die breiter wirken, als sie sind.

Im nachfolgenden Beispiel wurde das Sprite mit Hilfe von Register $D01D zusätzlich noch in X-Richting vergrößert. Mit Hilfe des Rasterzeilen-Interrupts wird auf das obere Ende des Sprites gewartet. Danach wird zeilenweise auf den Zeilensprung des Rasterstrahls gewartet und dann sofort die X-Koordinate des Sprites angepasst. Bei den beiden Badlines, die innerhalb der Spriteausgabe auftreten, muss eine Sonderbehandlung stattfinden, damit das Timing stimmt. Nachdem das ganze Sprite auf dem Bildschirm ist, wird die Interrupt-Routine wieder verlassen, damit der Computer anderen Tätigkeiten nachgehen kann.

*=$c000

         lda #147       ; Bildschirm leer
         jsr $ffd2

         lda #00        ; Hintergrund schwarz
         sta $d020
         sta $d021

         lda #99        ; Sprite initialisieren
         sta $d001
         lda #1
         sta $d015
         sta $d01d
         lda #13
         sta 2040
         ldx #62
-        lda .sprite,x
         sta 832,x
         dex
         bpl -

         sei

         lda #98        ; Interrupt auf Zeile 98
         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

bad1     nop            ; Spezialbehandlung für
         nop            ; Badlines
         nop
         nop
         nop
bad2     nop
         iny
         lda .indent,y
         sta $d000
         inc x+1        ; Modifikation des Codes
         bne next

vic_irq  ldy #$00       ; Index in die .indent-Tabelle

loop     lda .indent,y
-        ldx $d012      ; Auf Rasterzeile warten
x        cpx #100
         bne -
         sta $d000      ; X-Koordinate von Sprite 1 setzen

next     cpy #6
         beq bad1
         cpy #14
         beq bad2
         iny
         inc x+1        ; Modifikation des Codes
         cpy #23
         bne loop

         lda #145       ; Für neuen Durchlauf vorbereiten
         sta $d000
         lda #100
         sta x+1

         lda $d019      ; VIC-Interrupt bestätigen
         sta $d019

         pla            ; Interrupt geordnet beenden
         tay
         pla
         tax
         pla
         rti

; Sprite-Daten
.sprite  !by 255,255,255,255,255,254,254,63,249,255,203,249,255,249,121,255,255
         !by 25,63,255,255,255,255,226,255,255,193,255,255,129,255,255,132,255
         !by 255,132,255,255,228,191,255,248,159,255,254,159,255,255,159,255
         !by 255,252,1,248,240,0,120,240,0,30,240,0,30

; X-Koordinaten der einzelnen Zeilen
.indent  !by 146,137,129,122,116,111,103,104,102,101,100,101,100,101,101,102
         !by 103,110,110,108,108