Magic Disk 64

home to index to text: MD9411-KURSE-IRQ-KURS_13.2.txt
     Fortsetzung IRQ-Kurs (Teil 13)     

Kommen wir nun zum Beispiel " STRET-CHER.2" . Rein äußerlich unterscheidet sich diese Routine nicht von " STRET-CHER.1" . Auch hier wird dasselbe Sprite wieder verzerrt dargestellt, wobei die Verzerrung jedoch etwas anders ausfällt.
Rein theroretisch haben wir nur die Tabelle " AD017" verändert, so daß dasselbe Sprite ein anderes Aussehen erlangt.
Technisch gesehen wurde dieses Beispiel jedoch um ein zusätzliches Feature erweitert: Am Ende unserer IRQ-Routine, genau bevor wir die Prozessorregister wieder zurückholen und den IRQ mittels RTI verlassen, haben wir den Befehl " JSR $1300" hinzugefügt. An dieser Adresse befindet sich nun eine kleine Unterroutine, die es uns ermöglicht, flexiblere Dehnungen zu programmieren, ohne, daß wir uns Gedanken über den Aufbau der Tabelle " AD017" machen müssen. Sie greift auf eine Tabelle namens " LSTRETCH" zu, die 21 Bytes enthält, die jeweils die Anzahl der Rasterzeilen angeben, die eine jede der 21 Spritezeilen wiederholt werden soll. Die Tabelle liegt ab Adresse $1700 und sieht folgendermaßen aus:
lstretch:

 .byte $01   ;Spriteline01 1x Wdh.      
 .byte $02   ;Spriteline02 2x Wdh.      
 .byte $03   ;Spriteline03 3x Wdh.      
 .byte $04   ;Spriteline04 4x Wdh.      
 .byte $05   ;Spriteline05 5x Wdh.      
 .byte $06   ;Spriteline06 6x Wdh.      
 .byte $06   ;Spriteline07 6x Wdh.      
 .byte $05   ;Spriteline08 5x Wdh.      
 .byte $04   ;Spriteline09 4x Wdh.      
 .byte $03   ;Spriteline10 3x Wdh.      
 .byte $02   ;Spriteline11 2x Wdh.      
 .byte $01   ;Spriteline12 1x Wdh.      
 .byte $01   ;spriteline13 1x Wdh.      
 .byte $01   ;Spriteline14 1x Wdh.      
 .byte $01   ;Spriteline15 1x Wdh.      
 .byte $01   ;Spriteline16 1x Wdh.      
 .byte $01   ;Spriteline17 1x Wdh.      
 .byte $01   ;Spriteline18 1x Wdh.      
 .byte $01   ;Spriteline19 1x Wdh.      
 .byte $01   ;Spriteline20 1x Wdh.      
 .byte $00   ;Spriteline21 0x Wdh.      

Die Routine bei $1300(" STCHART" ist ihr Name) soll nun diese Werte in Folgen von $00/$01- Bytes umrechnen, und in der Tabelle " AD017" ablegen, so daß wir lediglich angeben müssen, welche Spritezeile wie oft wiederholt werden soll. Hier nun der Sourcecode der STCHART-Routine:

stchart                                 
  ldx #20     ;Zähler in X-Reg. init.   
  lda #$ff    ;Akku mit $FF init.       
fill:                                   
  sta ad017,x   ;AD017-Tab mit $FF      
  inx           ; auffüllen (=letzte    
  cpx #21*5     ; Spritezeile immer bis 
  bne fill      ; Ende wiederholen)     

ldy #$00 ; Index f. LSTRETCH-Tab ldx #$00 ; Index f. AD017- Tab nextline:
lda lstretch, y;1 . Wert lesen und in sta $ FF ;$ FF abl.
double:
dec $ FF ; Wert-1 beq normal ; Wert=0-> nächst. Zeile lda #$01 ; Sonst 1 x wiederholen in sta ad017, x ; AD017- Tab eintr.
inx ; AD017- Index+1 jmp double ; Und nochmal durchlaufen normal:

  lda #$00      ;Code für "nächste Zeile
  sta ad017,x   ; lesen" in AD017-Tab   
  inx           ;AD017-Index+1          
  iny           ;LSTRETCH-Index+1       
  cpy #20       ;Mit Ende vgl.          
  bne nextline  ;Nein, also nochmal     
  rts           ;Sonst Ende             

Wie Sie sehen füllt diese Routine lediglich die AD017- Tabelle so oft mit $01- Werten, wie der Bytewert einer Spritezeile aus LSTRETCH groß ist. Auf diese Weise können wir die Verzerrung einfacher handhaben, was uns in Beispiel 2 noch nichts nutzt, da hier immer nur dieselbe LSTRETCH-Tabelle benutzt wird, was uns aber bei den Beispielen 3 und 4 sehr zugute kommt.
3) PROGRAMMBEISPIELE 3 UND 4 Diese beiden Beispiele bauen nun auf den Grundstein, den wir mit den ersten beiden Programmen legten, auf." STRET-CHER.3" ist ein Programm, in dem Sie einen kleinen Flugsaurier auf dem Bildschirm flattern sehen. Diesen können Sie nun mit Hilfe eines Joysticks in Port 2 nach links und rechts über den Bildschirm bewegen. Drücken Sie den Joystick jedoch nach oben und unten, so können Sie unseren kleinen Freund wachsen oder wieder schrumpfen lassen, also fließend auf 5- fache Größe dehnen und wieder auf seine Ursprungsgröße zusammenschrumpfen lassen. Hierzu haben wir lediglich eine Joystickabfrage miteingebaut, die bei nach unten gedrücktem Joystick einen der Werte aus der Tabelle LSTRETCH um 1 erhöht, bei nach oben gedrücktem Joystick einen dieser Werte erniedrigt.
Dadurch, daß nun gleichzeitig auch nach jedem Rasterdurchlauf die Routine ST-CHART aufgerufen wird, wird somit die kleine Änderung durch die Joystickroutine direkt in die AD017- Tabelle übertragen, womit ein quasi stufenloser Dehnund Staucheffekt entsteht. Hierbei ist es übrigens wichtig, die richtige Spritezeile für eine Vergrößerung zu wählen.
In der Regel nimmt man dazu ein iteratives Verfahren, das die Anzahl der Spritezeilen, die eine Rasterzeile mehr dargestellt werden als Andere, so gleichmäßig verteilt, daß der Dehneffekt besonders flüssig erscheint. Dies sind jedoch Feinheiten, die wir hier nicht weiter besprechen möchten, da sie nicht zum Thema gehören.
Das Beispiel " STRETCHER.4" ist nun eine weitere Kombination aus den Beispielen 2 und 3 . Wir haben hier acht Mal den kleinen Flugsaurier auf dem Bildschirm, der in Sinuswellenform quasi über den Bildschirm " schwabbelt" . Hierbei haben wir uns eines einfachen Tricks bedient: Wir nahmen zunächst die LSTRETCH-Tabelle aus " STRETCHER.2", die eine Art runde Verzerrung in Vertikalrichtung erzeugt.
Diese Tabelle wird nun zyklisch durchgerollt. Pro Rasterdurchlauf kopieren wir die Bytes 0-19 um ein Byte nach vorne und setzen den Wert von Byte 20 wieder bei 0 ein. Dadurch entsteht der Effekt, als würden die kleinen Saurier als Reflektion auf einer gewellten Wasseroberfläche sichtbar sein!
Diese einfache Variation zeigt, mit welch simplen Methoden man eindrucksvolle Effekte durch Spritedehnung erzielen kann. Sie soll Sie wieder anregen, eigene Experimente mit unserer neuen Raster-Effekt- Routine durchzuführen.

                                 (ih/ub)

Valid HTML 4.0 Transitional Valid CSS!