Bewegungslehre
-> sanfte Bremsung
Aufgabenstellung:
Ein Sprite soll langsamer werden, je näher es seinem Ziel kommt. |
Ein ganz einfaches und praktisches Mittel, ein Sprite langsam abzubremsen,
ist seine aktuelle Distanz zum Zielpunkt durch einen bestimmten Faktor
zu dividieren.
Die Skizze zeigt die Distanz des Sprites in der Zeit, wenn der Divisionsfaktor
gleich 2 ist.
Die Berechnung der Spriteposition entspricht der "Bewegung
von A nach B", mit der einzigen Ausnahme, daß der restliche Weg
zu jedem Zeitpunkt neu berechnet werden muß.
neuerPunkt = letzterPunkt + (Bewegungsvektor / Divisionsfaktor)
|
|
|
Bei diesem einfachen Mittel, der Bewegung des Sprites ein bischen Eleganz
zu verleihen, sollte man nur 2 kleine Dinge beachten:
-
Der Divisionsfaktor sollte eine Fließkommazahl sein, da es ansonsten
zu unangenehmen Rundungsfehlern kommen würde. zB.: factor = 6.0
-
Auch bei der Position des Sprites muß man Rundungsfehler vermeiden.
Würde man bei jedem Frame die aktuelle Position des Sprites ablesen
(sprite(me.spriteNum).loc) erhält man immer ganzzahlige Werte, die
für die Berechnung einer langsame Bewegung tödlich sein können.
Wenn man stattdessen die Position als Property speichert, und immer mit
dieser weiterarbeitet, kann man wiederum mit Fließkommazahelen rechnen,
und die Berechnungen werden viel exakter.
Fügt man zur abbremsenden Bewegung auch noch die
Drehung hinzu, so hat man mit wenigen Zeilen ein Spriteverhalten geschaffen,
welches vergleichbar zum letzten Beispiel im Abschnitt "kreisförmige
Bewegung" viel netter aussieht und wesentlich lebendiger wirkt.
Das zugehörige Script ist kurz und schnell erklärt:
property pLoc, pSlowDownFactor
on beginSprite
me
pLoc = sprite(me.spriteNum).loc
-- Position des Sprites als Property festhalten
pSlowDownFactor = 6.0 -- Wert für die Verzögerung (float!)
end
on exitFrame
me
vector = the mouseLoc - pLoc -- Distanz zw. Sprite und Maus
pLoc = pLoc + (vector / pSlowDownFactor)
-- neuer Punkt, langsam der Maus angenähert
sprite(me.spriteNum).loc
= pLoc -- das Sprite positionieren
theAngle = GetAngle(vector) -- Winkel mittels des bereits beschriebenen Handlers berechnen
sprite(me.spriteNum).rotation
= theAngle -- Sprite drehen
end |
Ich persönlich verwende den Trick mit dem langsamen
Abbremsen bei jeder Möglichkeit: egal, ob sich ein Menü öffnen
soll, oder ein Slider selbständig die aktuelle Position einnehmen
soll, oder sonst was auf der Bühne rumtanzt - ich finde, es sieht
einfach viel netter aus.
|