public function update() : void {
In der update-Funktion wollen wir über alle Fahrzeuge iterieren; dazu benötigen wir eine Laufvariable (den Grund sehen wir gleich noch), nutzen also wieder eine normale Schleife mit der Laufvariablen i, um über alle in cars gespeicherten Fahrzeuge (cars.length an der Zahl) zu iterieren:
for ( var i:int = 0; i < cars.length; ++i ) {
Als erstes speichern wir innerhalb der Schleife das aktuelle Fahrzeug in der Variablen car; der Ausdruck cars[i] bedeutet, dass wir das i-te Element aus der Menge cars haben wollen (in der Mathematik würde man carsi schreiben):
var car:Car = cars[i];
Um die neue Position eines Fahrzeugs zu bestimmen, müssen wir es etwas auf der Kreisbahn bewegen; zu diesem Zweck müssen wir dem Fahrzeug die Möglichkeit geben, seine Geschwindigkeit an die Situation anzupassen. Hierfür benötigen wir das Fahrzeug, welches sich in Fahrtrichtung vor dem aktuellen befindet (sprich, das nächste Fahrzeug, da wir uns auf einer Kreisbahn bewegen und kein Fahrzeug das nächste überholen kann). Die folgende, etwas kryptisch anmutende Zeile extrahiert aus der cars-Menge ebenjenes Fahrzeug. Ohne allzu sehr ins Detail der Zeile gehen zu wollen, sei so viel gesagt: ist das aktuelle Fahrzeug nicht das letzte in der Menge, wird das sich an der folgenden Stelle befindliche extrahiert; ist das aktuelle Fahrzeug dagegen das letzte, so extrahieren wir das erste Fahrzeug der Menge (da dieses auf das letzte folgt, immerhin haben wir einen Kreis):
var nextCar:Car = ( i < cars.length - 1 ) ? cars[i + 1] : cars[0];
Die folgende Zeile ist die wichtigste für die Programmlogik, denn hier wird berechnet, wie weit sich das Fahrzeug fortbewegt. Das schöne an der Bewegung auf der Kreisbahn ist, dass die Rotation der Fahrzeuge direkt mit ihrer Position auf der Kreisbahn korrespondiert. Wenn wir ein Fahrzeug vorwärts bewegen wollen, müssen wir es also nur ein wenig weiter rotieren; wie stark diese Rotation sein soll, hängt von der Geschwindigkeit des Fahrzeuges ab. Also fragen wir das Fahrzeug mit Hilfe der Funktion calcSpeed (mehr dazu in der nächsten Datei), wie schnell es sich denn bewegt und geben zur Unterstützung der Berechnung sowohl das nächste Fahrzeug an als auch den Abstand, den die Fahrzeuge zueinander halten sollen (dist.value, wir erinnern uns). Der Faktor 0.9 beim einzuhaltenden Abstand hat stabilisierende Wirkung für die Simulation; da unser Kreis initial sehr dicht gepackt ist, geben wir den Fahrzeugen damit etwas mehr Platz, um ihren Abstand zu organisieren. Die von der calcSpeed-Funktion berechnete Geschwindigkeit (für den Interessierten: die Geschwindigkeit wird in Pixel Grad pro Frame berechnet) rechnen wir auf die aktuelle Rotation drauf (die Schreibweise x += y ist eine Kurzform von x = x + y):
car.rotation += car.calcSpeed( nextCar, dist.value * 0.9 );
Zur Bestimmung der neuen Position des Fahrzeugs benötigen wir nun nur noch ein wenig Mathematik. Wie bereits erwähnt, korrespondiert die Rotation des Fahrzeuges mit seiner Position auf dem Kreis; wir müssen also nur die Fahrzeugrotation in eine Grad-Zahl umrechnen, welche ebenjene Position beschreibt. Die folgende Zeile tut eben genau das (Math.PI repräsentiert die Kreiszahl π):
var circleRot:Number = car.rotation * Math.PI / 180;
Die Position des Fahrzeugs auf dem Kreis (car.x und car.y) lässt sich nun recht einfach mit Hilfe der Winkelfunktionen Sinus und Cosinus berechnen; der Wert 200 steht dabei für den Mittelpunkt des Kreises, der immer genau in der Bildmitte sein soll (wir erinnern uns: das Bild ist 400 Pixel breit und hoch) – der mathematische Hintergrund dieser Berechnung kann hier (insbesondere in den verschieden Abbildungen) einfach nachgelesen werden:
car.x = 200 + Math.cos( circleRot ) * -radius; car.y = 200 + Math.sin( circleRot ) * -radius;
Kommentare (18)