Bewegungslehre
-> langweilige Bewegung von A nach B
Aufgabenstellung:
Ein Sprite soll sich mit konstanter Geschwindigkeit von Punkt A zu Punkt B bewegen.

Speziell bei geradförmigen Bewegungen halte ich es für das Einfachste, die Bewegung anhand von "Pfeilchen" darzustellen, anhand von Vektoren.
 
Vektoren sind gerichtete Größen, gekennzeichnet durch:
  • Länge, Betrag (Zahlenwert)
  • Richtung einschl. Richtungssinn
  • Anfangspunkt bei ortsgebundenen Vektoren

  • Die Richtung und Länge der Bewegung läßt sich sehr einfach beschreiben, indem man "von dem blauen Pfeilchen b das rote Pfeilchen a abzieht." Man erhält ein neues grünes Pfeilchen AB, welches gleich lang und parallel zum eigentlichen Bewegungsvektor ist, aber beim Koordinatenursprung beginnt.

    In Lingo ist die ganze Sache mit Vektoren auch ganz einfach: Man nehme Punkte point(x, y), die sich wunderbar miteinander addieren und subtrahieren lassen.


    Vektoren resp. Punkte lassen sich auch mit reellen Zahlen multiplizieren (bzw. dividieren).

    Um einen momentanen Punkt während der Bewegung von A nach B zu erhalten, ist es daher lediglich notwendig den Vektor a mit einem entsprechenden Bruchteil vom Bewegungsvektor zu addieren. (Beispiel: ein Drittel der Gesamtbewegung.)



    Für die praktische Verwendung braucht man nur mehr die Rahmenbedingungen für die Geschwindigkeit des Sprites festlegen. Bei konstanter Geschwindigkeit stehen 3 Möglichkeiten zur Auswahl:
    1. die Bewegung soll in einer bestimmten Anzahl von Schritten erfolgen
    2. die Bewegung soll in einer bestimmten Zeit erfolgen
    3. jeder Schritt der Bewegung soll eine bestimmte Länge aufweisen

    ad 1) Bewegung in einer bestimmten Anzahl von Schritten

    Wenn die maximale Anzahl von Schritten gegeben ist (zB. im GetPropertyDescriptionList Handler), braucht man nur noch einen Zähler (am Besten als Property festhalten), und eine einzige Zeile, die die neue Position errechnet:

    neuerPunkt = StartPunkt + (Bewegungsvektor * Zähler / GesamtanzahlSchritte)
    Example: linearMovem1_inSteps.dir

    ad 2) Bewegung in einer bestimmten Zeit

    Am Anfang der Bewegung muß ein Timer gestartet werden, damit bei jedem Schritt der Bewegung die bereits verstrichene Zeit berechnet werden kann:

    neuerPunkt = StartPunkt + (Bewegungsvektor * verstrichenerZeit / GesamtZeit)
    Example: linearMovem2_inTime.dir

    ad 3) Bewegung mit bestimmten Schrittlängen

    Wenn sich das Sprite in einer bestimmten Anzahl von Pixeln pro Frame bewegen soll, ist es notwendig, die Gesamtlänge der Strecke zu kennen, um in weiterer Folge die Relation zw. Teilstrecke und Gesamtstrecke berechnen zu können.
    Für die Berechnung der Gesamtlänge hilft der Pythagoras.
    Für die Berechnung der Bewegung könnte man zB den aktuellen Punkt als Property festhalten, und von diesem aus den nächsten Punkt berechnen:

    neuerPunkt = letzterPunkt + (Bewegungsvektor * Schrittlänge / Gesamtlänge)
    Example: linearMovem3_inDistance.dir
    (Unter diesen Bedingungen könnte viel zur Scriptoptimierung getan werden.)

    Last: Übersicht