Sprite-Splitting

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Ein zweigeteiltes Sprite: Auto und Ball bewegen sich scheinbar unabhängig voneinander. Es handelt sich dabei aber nur um ein einzelnes Sprite.

Unter Sprite-Splitting versteht man die Zerlegung eines Sprites in zwei oder mehrere scheinbar unabhängige Einzelsprites.

Durch Veränderung der X-Koordinate eines Sprites zum richtigen Zeitpunkt kann dieses in zwei oder mehr Teile zerlegt werden, die sich in X-Richtung unabhängig voneinander bewegen können. Anders, als bei einem Sprite-Multiplexer müssen die Sprites in Y-Richtung nicht um mindestens 21 Pixel versetzt sein. Dadurch kann der Eindruck entstehen, dass sich mehr als 8 Sprites in einer Zeile befinden.

Das nachfolgende Beispiel-Programm bewegt abwechselnd die obere und die untere Hälfte des Sprites in X-Richtung. Man sieht ein Auto, welches sich nach rechts bewegt und einen Ball, der nach links wandert (halb so schnell, wie das Auto). Das höchstwertige Bit der X-Koordinate in Register $D010 wurde dabei nicht berücksichtigt, um das Programm einfach zu halten. Dies wäre aber problemlos möglich.

*=$c000

         lda #147        ; Bildschirm leer
         jsr $ffd2

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

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

         sei

         lda #99         ; Interrupt auf Zeile 99
         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  sta $d019       ; Rasterzeilen-Interrupt bestätigen
         lda $d012
         cmp #104
         bcs +

         lda .c1         ; Obere Hälfte um zwei Felder nach
         sta $d000       ; rechts
         inc .c1
         inc .c1
         lda #111        ; Rasterzeilen-Interrupt für
         sta $d012       ; untere Hälfte programmieren
         bne ++

+        lda .c2         ; Untere Hälfte um ein Feld nach
         sta $d000       ; links
         dec .c2
         lda #99         ; Rasterzeilen-Interrupt für
         sta $d012       ; obere Hälfte programmieren

++       pla             ; Interrupt geordnet beenden
         tay
         pla
         tax
         pla
         rti

.c1      !by 100         ; X-Koordinate für obere Hälfte
.c2      !by 200         ; X-Koordinate für untere Hälfte

; Sprite-Daten
.sprite  !by 0,255,192,15,8,32,62,8,16,127,255,254,241,255,31
         !by 238,254,239,223,125,247,223,125,246,31,1,240,14,0
         !by 224,0,0,0,0,60,0,0,239,0,1,253,128,3,103,192,3,195
         !by 64,2,195,192,3,230,192,1,223,128,0,251,0,0,60,0