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.


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
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,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
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