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)
Example: slowdown1_toMouse.dir


Bei diesem einfachen Mittel, der Bewegung des Sprites ein bischen Eleganz zu verleihen, sollte man nur 2 kleine Dinge beachten:
  1. Der Divisionsfaktor sollte eine Fließkommazahl sein, da es ansonsten zu unangenehmen Rundungsfehlern kommen würde. zB.: factor = 6.0
  2. 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.

Example: slowdown2_withRotation.dir

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.
Last: kreisförmige Bewegung