MOVSPR

Aus C64-Wiki
Zur Navigation springenZur Suche springen
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.