C 64
Sprites

Sprites schneller bewegen

Daß Sprites nützliche Hilfsmittel nicht nur bei Spielen sind, ist mittlerweile bekannt. Mit dem hier vorgestellten Programm lassen sich bis zu acht Sprites mit 255 verschiedenen Geschwindigkeiten kontinuierlich in acht Richtungen manövrieren. Das Besondere: Berechnungen im Programm haben keinen Einfluß auf die Laufgeschwindigkeit der Sprites.

Bild 1. In diesem Bildschirmbereich lassen sich die Sprites bewegen
Bild 2. Die Kennzahlen für die acht möglichen Richtungen

Eine feine Sache ist beim Commodore 64 die Sprite-Grafik. Hat man ein solches Sprite entwickelt und auf dem Bildschirm dargestellt, so kann durch Veränderung zweier Speicherstellen das Sprite an eine andere Position gebracht werden. Um eine fließende Bewegung zu erreichen, ändert man die Speicherstellen um den Faktor 1. Nun funktioniert dies bei einem einzigen Sprite noch recht zügig. Möchte man aber mehrere Sprites bewegen, zwischendurch etwas berechnen und abfragen, ob eine Kollision zwischen zwei Sprites stattgefunden hat, so werden die Bewegungen doch recht träge. Um die Bewegungen schneller erscheinen zu lassen, kann man die Schrittweite erhöhen. Dies hat aber den Nachteil, daß die Sprites ziemlich »abgehackt« über den Bildschirm laufen. Weiterhin muß beachtet werden, ob ein Sprite auf der rechten Bildschirmseite dargestellt werden soll. Ist dies der Fall, so muß im Register 16 das Bit für das entsprechende Sprite gesetzt werden. Bei der Rückkehr auf die linke Seite muß das Bit wieder gelöscht werden. Bild 1 zeigt den Bereich, in dem sich die Sprites bewegen können. Wenn Sie das Programm SPRITE-MOVE (siehe Listing) benutzen, so sind diese Probleme vorbei. Sie können ein Sprite nun mit dem Befehl

!RUN S,R,G

auf die Reise schicken. Mit dem S geben Sie die Nummer des Sprites an (0-7), mit R die Richtung (1-9) und mit G die Geschwindigkeit (0-255). In Bild 2 können Sie sehen, welche Zahl für welche Richtung einzusetzen ist. Die Zahl 5 kann eingegeben werden, hat aber keinen Einfluß. Bei der Geschwindigkeit G bedeutet 0 die schnellste und 255 die langsamste Bewegung. Die Sprites bewegen sich nun immer in der eingegebenen Geschwindigkeit. Sie können in Ihrem Basic-Programm berechnen oder abfragen so viel Sie wollen, dem Bewegungsdrang der Sprites tut dies keinen Abbruch. Verläßt ein Sprite den Bereich, in dem es sich bewegen kann (siehe Bild ]), so erscheint es wieder auf der gegenüberliegenden Seite. Wenn Sie dies nicht möchten, so müssen Sie durch Abfrage der entsprechenden Speicherstellen darauf reagieren. Anhalten können Sie ein Sprite mit dem Befehl

!STOP S.

Aufpassen muß man bei dem Befehl THEN. Zwischen THEN und dem neuen Befehl muß ein Doppelpunkt stehen, da es sonst zu einem SYNTAX-ERROR kommt.

Aufbau einer Spritebibliothek

Weiterhin haben Sie die Möglichkeit, ab der Speicherstelle 49900 bis zu 50 Sprites zu speichern und mit dem Befehl !VAL B1,B2 in den Block zu schieben, auf dem Ihr Sprite zugreift. B1 kann dabei Werte von 0 bis 7 annehmen. Und zwar bedeutet:
0 = Block 11
ab Speicherstelle 704
1 = Block 13
ab Speicherstelle 832
2 = Block 14
ab Speicherstelle 896
3 = Block 15
ab Speicherstelle 960
4 = Block 32
ab Speicherstelle 2048
5 = Block 33
ab Speicherstelle 2112
6 = Block 34
ab Speicherstelle 2176
7 = Block 35
ab Speicherstelle 2240

Wenn Sie die Blöcke 32 bis 35 benützen, müssen Sie den Zeiger, der auf den Beginn des Basic-Programms zeigt, ändern, Mit POKE 2560,0 beginnt Ihr Basic-RAM-Bereich ab Speicherstelle 2561. Anschließend geben Sie noch NEW ein.

Bringen Sie Bewegung in die Sprites

B2 kann Werte von 0 bis 49 annehmen. Errechnen können Sie die Anfangsspeicherstelle für B2 mit 49900 + B2 * 63. Sie können sich so eine ganze Sprite-Bibliothek anlegen und bei Bedarf abrufen. In Bild 3 sehen Sie ein Programm, mit dem Sie die Sprites (die ab Speicherstelle 49900 stehen) zusammen mit dem Programm SPRITE-MOVE auf Kassette wegspeichern können. Denkbar wäre auch, daß man sich ähnlich aussehende Sprites speichert und diese abwechselnd einschaltet. Dadurch kann man den Eindruck einer sich bewegenden Figur erzeugen. (Siehe Beispielprogramm in Bild 4).

Alle Parameter für die neuen Befehle können Zahlen oder auch Variablen sein. Außerdem funktionieren die Befehle sowohl im Direktmodus als auch innerhalb eines Basicprogramms.

Sprites for ever

Das Programm steht von Speicherstelle 49229 bis 49798. Die Speicherstellen 49152 bis 49228 werden vom Programm als Speicher benutzt. Aktiviert werden die neuen Befehle mit SYS 49700. Im Basic-Lader geschieht dies in Zeile 172. Sollten Sie die RUN/STOP- und RESTORE-Taste betätigen, so müssen Sie das Programm neu aktivieren. Und nun viel Spaß mit den neuen, schnellen Sprites.

(Herbert Kunz)
5 remsprite-move
10 poke183,11:poke185,0:poke186,1
20 poke187,peek(43)+5:poke188,peek(44)
30 poke193,77:poke194,174:poke174,59
40 poke175,207:sys62954
50 rem zeile 5 bitte mit eingeben
60 rem laden erfolgt mit load"sprite-move",1,1
70 rem nach dem laden new eingeben
Bild 3. Mit diesem kurzen Programm lassen sich die Sprites abspeichern
200 print"{clr}":v=53248:sys49700
210 forn=0to125:readq:poke49900+n,q:next
215 fori=2040to2047:pokei,13:next
220 pokev+23,255:pokev+29,255
230 g=v:fori=0to7:x(i)=g:g=g+1:y(i)=g:g=g+1:next
240 fori=0to7:pokex(i),120:pokey(i),120:next
250 fori=0to7:pokev+39+i,1:next
260 !val1,0:pokev+21,255
270 !run0,2,5:!run1,1,8:!run2,3,10:!run3,4,0
280 !run4,6,255:!run5,7,35:!run6,8,20:!run7,9,4
290 fori=0to15000:next
300 fori=0to7:!stopi:next
310 fori=0to500:next:pokev+21,1:r=8
320 pokex(0),200:pokey(0),200
325 !run0,r,50
330 fori=0to200:next:!val1,1
340 fori=0to200:next:!val1,0
350 ifpeek(y(0))<50orpeek(y(0))>200thenr=10-r
360 goto325
1000 data,,,,,,32,32,32,16,80,64,8,112,128,7,255,,1,252,,,136,,1,140
1010 data,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2000 data,,,,,,,32,,,80,,,112,,127,255,240,1,252,,,136,,1,140
2010 data,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Bild 4. Dieses Programm dient als Beispiel für Sprites mit Bewegungseffekt
100 rem  49229 - 49798
101 data162,0,189,0,192,201,1,240,8
102 data232,224,8,208,244,76,76,193
103 data56,189,26,192,233,1,157,26,192
104 data144,3,76,86,192,189,16,192,157
105 data26,192,142,24,192,189,8,192
106 data201,1,240,31,201,2,240,42,201
107 data3,240,50,201,4,240,61,201,6
108 data240,69,201,7,240,77,201,8,240
109 data88,201,9,240,96,76,86,192,32
110 data7,193,32,26,193,32,39,193,174
111 data24,192,76,86,192,32,7,193,32
112 data39,193,174,24,192,76,86,192
113 data32,7,193,32,13,193,32,39,193
114 data174,24,192,76,86,192,32,7,193
115 data32,26,193,174,24,192,76,86,192
116 data32,7,193,32,13,193,174,24,192
117 data76,86,192,32,7,193,32,26,193
118 data32,48,193,174,24,192,76,86,192
119 data32,7,193,32,48,193,174,24,192
120 data76,86,192,32,7,193,32,13,193
121 data32,48,193,174,24,192,76,86,192
122 data173,24,192,10,168,96,24,177
123 data247,105,1,145,247,144,3,76,57
124 data193,96,56,177,247,233,1,145
125 data247,176,3,76,57,193,96,200,24
126 data177,247,105,1,145,247,96,200
127 data56,177,247,233,1,145,247,96
128 data174,24,192,169,1,202,48,4,10
129 data76,62,193,77,16,208,141,16,208
130 data96,206,40,192,48,5,162,0,76
131 data79,192,169,6,141,40,192,76,49
132 data234,32,115,0,201,33,240,9,32
133 data121,0,76,231,167,76,8,175,32
134 data115,0,201,138,240,29,201,144
135 data240,7,201,197,240,81,76,107
136 data193,32,115,0,32,158,183,224
137 data8,176,225,169,0,157,0,192,76
138 data174,167,32,115,0,32,158,183
139 data224,8,176,207,169,1,157,0,192
140 data142,41,192,32,253,174,32,158
141 data183,224,10,176,189,138,240,186
142 data201,5,240,6,174,41,192,157,8
143 data192,32,253,174,32,158,183,138
144 data174,41,192,157,16,192,157,26
145 data192,76,174,167,32,115,0,32,158
146 data183,224,8,144,3,76,8,175,142
147 data47,192,32,253,174,32,158,183
148 data224,50,176,240,232,142,46,192
149 data173,47,192,10,170,189,48,192
150 data133,251,232,189,48,192,133,252
151 data32,126,194,173,46,192,170,202
152 data240,14,24,165,249,105,63,133
153 data249,144,244,230,250,76,3,194
154 data160,0,177,249,145,251,200,192
155 data64,208,247,76,174,167,234,234
156 data169,94,141,8,3,169,193,141,9
157 data3,169,77,141,20,3,169,192,141
158 data21,3,169,0,133,247,169,208,133
159 data248,169,192,141,48,192,141,54
160 data192,141,62,192,169,2,141,49
161 data192,169,64,141,50,192,141,58
162 data192,169,3,141,51,192,141,53
163 data192,141,55,192,169,128,141,52
164 data192,141,60,192,169,0,141,56
165 data192,169,8,141,57,192,141,59
166 data192,141,61,192,141,63,192,169
167 data236,133,249,169,194,133,250
168 data96
169 s=0:fori= 49229 to 49798 :readd
170 poke i,d:s=s+d:next
171 ifs<>69859thenprint"{rvon}fehler{rvof}":stop
172 sys49700
Basic-Lader von »Sprite-Move«
PDF Diesen Artikel als PDF herunterladen
Mastodon Diesen Artikel auf Mastodon teilen
← Vorheriger ArtikelNächster Artikel →