MOVSPR
MOVSPR | |
Syntax: | MOVSPR <Sprite>, [ + | - ]<X>, [ + | - ]<Y> oder MOVSPR <Sprite>, <Strecke>;<Winkel> oder MOVSPR <Sprite>, <Winkel>#<Geschwindigkeit> |
Parameter | |
<Sprite>: numerischer Ausdruck im Wertebereich von 1 bis 8 | |
<X>: numerischer Ausdruck im Wertebereich von -65535 bis 65535 | |
<Y>: numerischer Ausdruck im Wertebereich von -65535 bis 65535 | |
<Strecke>: numerischer Ausdruck im Wertebereich von -65535 bis 65535 | |
<Winkel>: numerischer Ausdruck im Wertebereich von -65535 bis 65535 (effektiv 0 bis 359) | |
<Geschwindigkeit>: numerischer Ausdruck im Wertebereich von -65536 bis 65535 (effektiv 0 bis 15) | |
Einordnung | |
Typ: | Anweisung |
Kontext: | Sprites |
Aufgabe: | Setzen der Position oder Bewegungsrichtung und Geschwindigkeit eines Sprites |
Abkürzung: | mO |
Token: | $fe $06 (254 6) |
Verwandte Befehle | |
COLLISION, RSPPOS, RSPRITE, SPRITE |
Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl MOVSPR ab Commodore BASIC V7.0 oder höher.
Die Anweisung MOVSPR setzt die Position oder Bewegungsrichtung und Geschwindigkeit eines Sprites.
Der Befehl besitzt 3 Parameter, wobei der erste die Nummer des betroffenen Sprites angibt. Diese darf zwischen 1 und 8 liegen, anderenfalls wird die Fehlermeldung ?ILLEGAL QUANTITY ERROR ausgegeben. Die Bedeutung des nachfolgenden Parameterpaares hängt vom Trennzeichen zwischen den beiden Werten ab:
- Trennzeichen ist ein Komma (,)
- Setzen der Position des Sprites in kartesischen Koordinaten, entweder absolut oder relativ zur momentanen Position.
- <X>: Horizontale, skalierte Koordinate; Wird ein Vorzeichen vor den Wert gesetzt, wird der Betrag zur aktuellen X-Position addiert (bei +) oder subtrahiert (bei -).
- <Y>: Vertikale, skalierte Koordinate; Wird ein Vorzeichen vor den Wert gesetzt, wird der Betrag zur aktuellen Y-Position addiert (bei +) oder subtrahiert (bei -).
- Ausdrücke für relative Koordinaten müssen in Klammern gesetzt werden. Relative und absolute Angaben dürfen gemischt werden. Beide Parameter dürfen im Wertebereich von -65535 bis +65535 liegen, ansonsten wird ein ?ILLEGAL QUANTITY ERROR ausgelöst. Ausdrücke mit negativem Ergebnis werden interpreterseitig nach der Formel 65536-<Betrag Parameter> in einen positiven Wert umgewandelt.
- Trennzeichen ist ein Semikolon (;)
- Bewegen des Sprites in einem bestimmten Winkel um eine bestimmte Strecke relativ zur aktuellen Position.
- <Strecke>: Skalierte Anzahl der Pixel, um die das Sprite verschoben wird. Erlaubt ist der Wertebereich von -65535 bis +65535. Ergebnisse außerhalb diesen Bereichs lösen einen ?ILLEGAL QUANTITY ERROR aus. Ausdrücke mit negativem Ergebnis werden interpreterseitig nach der Formel 65536-<Betrag Parameter> in einen positiven Wert umgewandelt.
- <Winkel: Winkel in Grad im Uhrzeigersinn, in dem das Sprite verschoben wird. Der Winkel 0 steht für senkrecht nach oben. Werte über 359 werden modulo 360 gerechnet (Rest bei Division durch 360). Das Ergebnis des Ausdrucks muss im Wertebereich von -65535 bis +65535 liegen, ansonsten kommt es zum Fehler ?ILLEGAL QUANTITY ERROR. Ausdrücke mit negativem Ergebnis werden nach besonderen Gesetzmäßigkeiten in einen positiven Wert umgewandelt (siehe Beispiele). Eine Winkelangabe beispielsweise von -1 ergibt effektiv nicht 359°, sondern 255°.
- Trennzeichen ist eine Raute (#)
- Einstellen von Bewegungsrichtung und -geschwindigkeit des Sprites.
- <Winkel>: Siehe oben.
- <Geschwindigkeit>: Geschwindigkeit, mit der das Sprite bewegt wird. Erlaubt ist der Wertebereich von -65535 bis +65535. Ergebnisse außerhalb diesen Bereichs lösen einen ?ILLEGAL QUANTITY ERROR aus. Ausdrücke mit negativem Ergebnis werden interpreterseitig nach der Formel 65536-<Betrag Parameter> in einen positiven Wert umgewandelt. Es werden nur die ersten 4 Bits des Betrages verwendet, sodass effektiv 16 Geschwindigkeitsstufen eingestellt werden können:
- 0: keine Bewegung.
- 1: Minimale Bewegung (Pixelgeschwindigkeit) beträgt ca. 0,5 Pixel pro Raster-Interrupt, d.h. ca. 25 Pixel/s bei PAL und ca. 30 Pixel/s bei NTSC.
- 2 bis 15: Die minimale Pixelgeschwindigkeit multipliziert mit diesem Wert ergibt die effektive.
- Die Spritebewegung wird nur bei aktiven (sichtbaren) Sprites ausgeführt.
Beispiele[Bearbeiten | Quelltext bearbeiten]
MOVSPR 1,24,50
Positioniert das erste Sprite an die linke, obere Ecke des Bildschirms.
MOVSPR 2,24,+10
Positioniert das zweite Sprite an den linken Rand und verschiebt es gleichzeitig vertikal um 10 Pixel nach unten.
SCALE 1,320,400 MOVSPR 2,24,+10
Wie oben, aber das Sprite wird aufgrund der Skalierung nur um 5 Pixel verschoben (unabhängig vom aktiven Grafikmodus).
DO: FOR W=0 TO 359 STEP 5: MOVSPR 1,2;W: NEXT: LOOP
Das Sprite bewegt sich endlos im Kreis.
MOVSPR 1,45#15
Das Sprite bewegt sich mit maximaler Geschwindigkeit von links unten nach rechts oben über den Bildschirm
Negative Winkelangaben
Dieses Programm stellt zwei Sprites dar, wobei ein Sprite den originalen negativen Winkel erhält, während das andere Sprite zur Kontrolle mit dem korrespondierenden, errechneten positiven Winkel bewegt wird. So kann man sich von der Korrektheit der Umrechnung überzeugen. Mit den CRSR -Tasten kann der Winkel mit Links/Rechts in Einerschritten und mit Rauf/Runter in 100er-Schritten verändert werden. Nach jeder Änderung bewegen sich die Sprites etwas von der Bildschirmmitte weg in die entsprechende Richtung.
100 GRAPHIC 1,1 110 REM SPRITE ERZEUGEN (GROSSES X) 120 DRAW 1, 0,0 TO 23,20 121 DRAW 1, 0,20 TO 23,0 130 S=1: REM SPRITE ORIGINAL 131 P=2: REM SPRITE KONTROLLE 140 SSHAPE A$, 0,0,23,20 150 SPRSAV A$,S 151 SPRSAV A$,P 160 SPRITE S,1,8,0,0,0,0 161 SPRITE P,1,11,0,0,0,0 170 MOVSPR S,21,50 171 MOVSPR P,21,50 1000 GRAPHIC 0 1010 PRINT "{CLR}" 1020 AO=-32500 : REM GRENZWERTNAEHE 1030 V=4 1050 DO 1060 MOVSPR S,180,150 1061 MOVSPR P,180,150 1100 MOVSPR S,AO#V : REM ORIGINALPOSITION 1101 AA=AO 1102 IF AA>=0 GOTO 1109 1103 M=360:IF AO>-32513 THEN M=256 : REM MODUL 1104 D=(65536+AA)/M : REM WINKEL POSITIV MACHEN 1105 AA=INT((D-INT(D))*M+.5) : REM RESTWERT GEMAESS MODUL 1109 MOVSPR P,AA#V : REM UMGERECHNETE POSITION 1200 PRINT "{HOME}WINKEL: SPRITE1="AO;"{LEFT} SPRITE2="AA"{LEFT} " 1280 DO 1290 GET A$:IF A$="" THEN LOOP 1300 IF A$="{LEFT}" AND AO>=-65535 THEN AO=AO-1 1301 IF A$="{RGHT}" AND AO<=355 THEN AO=AO+1: IF AO>=360 THEN AO=0 1302 IF A$="{UP}" AND AO>=-65535 THEN AO=AO-100 1303 IF A$="{DOWN}" AND AO<=355 THEN AO=AO+100: IF AO>=360 THEN AO=0 1390 LOOP UNTIL 1 1400 LOOP
Der zu einem negativen Winkel korrespondierende positive Winkel ist nicht einheitlich über den gesamten negativen Wertebereich.
Für den Winkel WI (in Klammern als hexadezimaler Wert der korrespondierenden 2er-Komplementdarstellung):
- -32512 ($8100) bis -1 ($FFFF): MOD(65536-ABS(WI),256)
- -65535 ($FFFF) bis -32513 ($80FF): MOD(65536-ABS(WI),360)
unter Annahme einer Modulo-Funktion MOD(<wert>,<modul>). Diese wird im Programm Mithilfe der Division und Funktion INT() nachgebildet.
APPEND | BANK | BEGIN | BEND | BLOAD | BOOT | BSAVE | BUMP | CATALOG | COLLISION | COLOR | CONCAT | DCLEAR | DCLOSE | DOPEN | DVERIFY | ENVELOPE | FAST | FETCH | FILTER | GO64 | MOVSPR | (OFF) | PEN | PLAY | POINTER | POT | (QUIT) | RECORD | RREG | RSPCOLOR | RSPPOS | RSPRITE | RWINDOW | SLEEP | SLOW | SOUND | SPRCOLOR | SPRDEF | SPRITE | SPRSAV | STASH | SWAP | TEMPO | WIDTH | WINDOW | XOR