"GESTATTTEN, MEIN NAME IST SPRITE!"
Ein Kurs zum näher Kennenlernen.
Teil 1
Ob MultiColour oder Hires, expanded oder
multiplexed, im Border oder nicht im
Border; jeder kennt sie: SPRITES!
Diese 21 Pixel hohen und 24 Pixel
breiten " Grafik-Inhalte" werden oft zu
Recht als Kobolde bezeichnet. Denn da
sie in Positions-Gebung, Größe und Anzahl äußerst flexibel sind, verschwinden
und wieder auftauchen können, wann sie
wollen, weisen sie selbige Charakterzüge
auf. Und, so meine ich behaupten zu
können, gäbe es sie nicht, gäb' s den C64 auch nicht mehr.
In unzähligen Spielen und ebenso vielen
Demos wurde realisiert, was mit den Grafik-Modi ( egal ob Textoder Grafik) niemals( !) möglich gewesen wäre. Ob nun
der Held eines Games in Sprites verpackt
wurde oder Logos über Landschaften bewegt wurden; auf größeren Rechnern wie
Amiga oder PC ist dies immer mit Grafik-Verschiebung verbunden, was immer viel
Rechen-Zeit und-Aufwand bedeutet, wohingegen die DMA des C64 rasterzeitsparend arbeitet und jegliche Objekte
durch Umschalten der Spriteblock-Pointer
noch ohne zusätzlichen Zeit-Verlust
animiert werden können.
Gut, der Titel " Sprites zum Näher-Kennen- lernen" dieses 3 teiligen Kurses trifft
den Nagel genau auf den Kopf. Wer
nämlich noch überhaupt keine Erfahrung
mit Sprites hat, sollte dies zuvor unbedingt nachholen. Dieser Kurs ist
wirklich zum NÄHER( !) Kennenlernen.
Erfahrung mit den VIC-( spez. Sprite-) Registern und fortgeschrittene Assembler- Kenntnisse sind Vorraussetzung.
Beginnen wollen wir mit:
1.JOYSTICK-ABFRAGE UND BESCHLEUNIGTE BEWEGUNG
Unser " Sprite-Demo #1" installiert eine
Abfrage in den Raster-Irq, die ein
SMILIE-Sprite ( auch diese Sorte werden
wir näher kennenlernen. . .) vom Joystick
in Port #2 gesteuert über den Bildschirm
fliegen läßt. Das Besondere dabei ist
die beschleunigte( !) Bewegung in Xals
auch in Y-Richtung.
Meine Lösung einer beschl. Joystick-Abfrage sieht folgend aus:
Horizontal und vertikal verwende ich
jeweils einen Pointer ( Xpoint, Ypoint), welcher den Index zu einer Tabelle
darstellt, aus welcher die eigentliche
Geschwindigkeit gelesen wird. Bei Betätigung des Joysticks werden nun diese
Pointer verändert; um 1 erhöht bzw. um 1
erniedrigt.
Sieht dann so aus ( in Y-Richtung) :
lda $dc00 ;CIA #1=Joystick sta joyst ;speichern and #1 ;Joystick up? bne t5 ;nein, dann t5 lda ypoint ;ja, cmp #1 ;dann ypoint auf #1 beq t10 ;prüfen dec ypoint ;ypoint erniedrigen jmp t10 ;jump t10 t5 lda joyst ;Joystick lesen and #2 ;down ? bne t8 ;nein, dann t8 lda ypoint ;ja, cmp #31 ;dann ypoint auf #31 beq t10 ;prüfen inc ypoint ;ypoint erhöhen bne t10 ;nach t10 (Fortsetzung)
Nun gibt es den Fall, daß weder hinauf
noch hinunter beschleunigt wird. Dabei muß eine bestehende Geschwindigkeit vermindert werden; es muß GEBREMST werden!
Das Programm arbeitet in diesem Fall bei
Label t8 weiter. . .
t8 lda #0 ; Y-Bremse:
inc t8+1 ;t8+1 (lda #?) erhöhen and #1 ;bit #0 gesetzt ? bne t10 ;ja, dann keine Bremse lda ypoint ;ypoint prüfen cmp #16 ;mit 16 vergleichen beq t10 ;wenn =16 dann ok bcc t9 ;wenn <16 dann nach t9 dec ypoint ;wenn >16 dann bne t10 ;erniedrigen t9 inc ypoint ;erhöhen t10 ;...Fortsetzung...
Zu Beginn wird der Absolut-Wert, der bei
t8 in den Akku geladen wird, erhöht.
Somit haben wir einen ständig durchlaufenden Timer. Ist dieser Wert
ungerade ( also jedes 2 . Mal) wird die
Brems-Routine nicht ausgeführt. Somit bremst unser Smilie langsamer, als er
beschleunigt.
Wenn ypoint gleich 16 ist, ist die Y-Bewegung gleich 0( warum, sehen wir
später) . Also prüfen wir, ob der Wert
kleiner oder größer als 16 ist, und
erhöhen bzw. erniedrigen ypoint danach.
Funktioniert diese Abfrage und wir
haben selbiges auch horizontal für eine
X-Bewegung programmiert, so wird der
Joystick zwar abgefragt, die Pointer
dementsprechend verändert, sogar gebremst. . . doch sichtbar zeigt sich noch
GAR NICHTS!
Wir wollen nun den Yund X-Pointer verwenden, um dem Sprite Geschwindigkeit zu
geben. Dazu müssen wir eine Tabelle
anlegen, aus der wir die zum Pointer-Wert entsprechenden " Speeds" lesen und
nennen sie " speedtab" . Das Ganze zu den
aktuellen Sprite-Koordinaten addiert und schon läuft die Sache. . .
lda ypoint ;Y-Bewegung: clc ;Y-point plus adc #1 ;#1 dazu, lsr a ;dann lsr a ;geviertelt tax ;und ins X-Register lda v+1 ;Sprite #0 Y-Position clc ;dazu Wert aus adc speedtab,x ;Speedtab+x addiert sta v+1 ;schreiben cmp #50 ;Oben Limit: bcs t21 ;größer, dann nicht lda #50 ;Y-Position auf sta v+1 ;#50 setzen lda ypoint ;Ypoint invertieren eor #31 ;und #2 clc ;dazuzählen, adc #2 ;um Bewegung sta ypoint ;umzukehren jmp t25 ;jump t25 t21 cmp #230 ;Unten Limit: kleiner bcc t25 ;als 230, dann nicht lda #230 ;Y-Position auf sta v+1 ;#230 setzen lda ypoint ;Ypoint and #254 ;invertieren, eor #31 ;um Bewegung sta ypoint ;umzukehren t25
In Speedtab stehen positive und negative
Werte. In unserem Fall reichen die
Speeds von -4 bis +4 . Der Pointer-Wert
wird zuerst durch 4 geteilt, wobei
zuvor #1 dazugezählt wird. Ypoint kann
also Werte von 1 bis 32 besitzen, durch
4 geteilt folglich Werte von 0-8 .
Diese 9 Werte sehen im Byte-Format dann
so aus:
speedtab .byte 252...255 ;Negativ-Bereich .byte 0 ;Mitte = 16 = Speed 0 .byte 1,2,3,4 ;Positiv-Bereich
Da wir immer zum Sprite-Y- Register addieren, ergibt ein Operand #255 also
-1,#254 dann -2 usw. . .
In X-Richtung gilt selbes Muster wie
vertikal. Durch das X-Hi- Byte wird' s ein
wenig komplizierter, doch ein Blick ins
Source-File gibt Verständnis.
2.PROGRAMMIERTES BEWEGEN VON SPRITES
" Sprite-Demo #2" läßt unseren SMILIE
eine xbeliebige Bewegung am Bildschirm
vollziehen, die er immer wieder neu beginnt. Zuerst wird inititalisiert, wobei
dem Sprite eine fixe Star-Position
zugeordnet wird und die Bewegungs-Pointer zurückgesetzt werden.
Aus der Liste " movedats" wird nun ausgelesen. Und zwar immer fünf Bytes, welche gleich den Adressen up, down, left
right und time zugeordnet werden.
In " up" steht dann, wieviel Pixel das Sprite nach oben bewegt werden soll, in " down" wieviel nach unten, usw. . .
" time" schließlich gibt an, wie oft
dieser Step wiederholt werden soll, bis
die nächsten Werte ausgelsen werden.
Solange time ungleich 0 ist, werden
immer die selben Werte addiert bzw.
subtrahiert. Die Liste " movedats" wird
mit #255 abgeschlossen, worauf das
Programm automatisch den Listenpointer
wieder zurücksetzt. Die Bewegung startet
da capo.
Das X-Hi- Byte ($ d010) wird mit der
Adresse " xhi" beschrieben.
Diese Bewegungs-Routine eignet sich im
Besonderen für Spiele, da sich sehr
umfangreiche und unregelmäßige Bahnen
gestalten lassen. Sie soll nur eine
Anregung dazu sein, eigene Routinen zu
entwickeln, die speziell für Spiele
sehr zweckmäßig sind.
Im nächsten Teil gibt' s Action( !) mit
mehr als 8 Sprites gleichzeitig. . .
Also, bis bald!