RSPPOS

Aus C64-Wiki
Zur Navigation springenZur Suche springen
RSPPOS
Syntax: RSPPOS(<Sprite>, <n>)
Parameter
<Sprite>: numerischer Ausdruck im Wertebereich von 1 bis 8
<n>: numerischer Ausdruck im Wertebereich von 0 bis 2
Einordnung
Typ: numerische Funktion
Kontext: Sprites
Aufgabe: Position und Geschwindigkeit eines Sprites ermitteln
Abkürzung: rS
Token: $ce $05 (206 5)
Verwandte Befehle
COLLISION, MOVSPR, RSPRITE, SPRITE

Anmerkung: Dieser Artikel beschreibt die BASIC-Funktion RSPPOS ab Commodore BASIC V7.0 oder höher.


Die Funktion RSPPOS dient dazu, Position und Geschwindigkeit eines Sprites abzufragen.

Die Parameter haben folgende Bedeutung:

  • <Sprite>: Nummer des Sprites, dessen Position abgefragt wird. Dieser Wert darf zwischen 1 und 8 liegen, andere Werte verursachen einen Abbruch mit der Fehlermeldung ?ILLEGAL QUANTITY ERROR. Fehlt der Parameter wird ?SYNTAX ERROR ausgegeben, bei einer Zeichenkette als Parameter dagegen ?TYPE MISMATCH ERROR.
  • <n>: Dieser Parameter gibt an, welcher sprite-spezifischer Wert ermittelt werden soll und kann folgende Werte annehmen:
    • 0: X-Koordinate (horizontale Position) des Sprites abfragen; das Ergebnis kann zwischen 0 und 511 liegen.
    • 1: Y-Koordinate (vertikale Position) des Sprites abfragen; das Ergebnis kann zwischen 0 und 255 liegen.
    • 2: Geschwindigkeit des Sprites ermitteln; das Ergebnis kann zwischen 0 und 15 liegen.

Der Bewegungswinkel eines Sprites kann nicht abgefragt werden (allerdings errechnet, siehe Beispiele).

Beispiele[Bearbeiten | Quelltext bearbeiten]

IF RSPPOS(1,0)>343 THEN MOVSPR 1,0,+0

Ist die horizontale Position von Sprite 1 größer als 343 (Sprite befindet sich vollständig im rechten Rahmenbereich), wird es an die X-Koordinate 0 bewegt. Die vertikale Position bleibt unverändert.

V=RSPPOS(1,2):IF V<15 THEN MOVSPR 1,A#V+1

Speichert die Geschwindigkeit von Sprite 1 in der Variablen V und erhöht sie dann (sofern der Maximalwert noch nicht erreicht wurde) um 1. Da der Bewegungswinkel nicht direkt abgefragt werden kann (siehe folgendes Beispiel), ist dieser in der Variablen A (für Angle) hinterlegt.


Winkelermittlung

100 GRAPHIC 1,1 : REM HIRES
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-NUMMER
140 SSHAPE A$, 0,0,23,20
150 SPRSAV A$,S
160 SPRITE S,1,8,0,0,0,0
170 MOVSPR S,21,50
1000 GRAPHIC 0 : REM WIEDER TEXTMODUS
1010 PRINT "{clr}"
1020 AO=315 : REM ANGLE ORIGINAL
1030 V=3 : REM SPRITE-GESCHWINDIGKEIT
1100 MOVSPR S,AO#V
1110 XL=RSPPOS(S,0)
1120 YL=RSPPOS(S,1)
1200 DO
1210 X=RSPPOS(S,0):Y=RSPPOS(S,1)
1230 DX=XL-X:IF ABS(DX)>100 THEN DX=DX-512*SGN(DX) : REM BEREICHSUEBERLAUF X
1240 DY=Y-YL:IF ABS(DY)>100 THEN DY=DY-256*SGN(DY) : REM BEREICHSUEBERLAUF Y
1250 IF DY=0 THEN DY=1E-30 : REM DIVISION DURCH 0 VERMEIDEN
1260 A=INT(ATN(DX/DY)*180/π+.5) : REM WINKEL ERMITTELN UND UMRECHNEN
1265 A=A-180*(A<0)-180*(DX>=0): REM WINKEL VON -90 BIS 90 AUF 0-360 ABBILDEN 
1270 XL=X:YL=Y : REM ALTE (LAST) POSITION MERKEN
1280 PRINT ".WINKEL: GESETZT="AO;"{left} GEMESSEN="A"{left}    "
1290 GET A$:IF A$="" THEN LOOP : REM TASTENABFRAGE FUER WINKEL
1300 IF A$="{left}" AND AO>=5 THEN AO=AO-5
1310 IF A$="{right}" AND AO<=355 THEN AO=AO+5: IF AO=360 THEN AO=0
1320 MOVSPR S,AO#V : REM SPRITE-RICHTUNG NEU SETZEN
1390 LOOP

Ein Sprite wird aus einer Hires-Grafik erzeugt (gelbes "X") und in Bewegung gesetzt. In einer Schleife wird durch Differenzermittlung der Sprite-Position der Winkel mittels Arcustangens-Funktion ATN() ermittelt und für die laufende Anzeige als Wert in Grad korrespondierend zum Angle-Parameter von MOVSPR aufbereitet.
Der Sprite-Winkel kann interaktiv mit den CRSR -Tasten "links" und "rechts" in 5er-Schritten verkleinert bzw. vergrößert werden.
Die Differenzermittlung berücksichtigt den Wertebereichsübergang von RSPPOS (selbst bei Geschwindigkeit 15). Die ATN-Funktion ist zum einen ziemlich rechenintensiv und liefert an sich nur Winkel von -90 bis +90 Grad, was noch einer weiterer Aufbereitung bedarf.