private var radius:int = 180; private var perimeter:int = 2 * Math.PI * radius; private var cars:Vector.<Car> = new Vector.<Car>();
Die nächste Zeile leitet die schon öfter erwähnte Funktion reset ein. Sie hat die Aufgabe, alle sich in der Szene befindlichen Fahrzeuge zu entfernen sowie neu zu setzen, die Szene also zurückzusetzen:
public function reset() : void {
In der ersten Zeile der Funktion wird eine Variable car vom Typ eines Fahrzeugs (sprich: Cars) zur späteren Verwendung angelegt (zum Thema Variablen siehe hier, zum Thema Datentypen hier):
var car:Car;
Die folgenden Zeilen sorgen dafür, dass alle sich bereits in der Szene befindlichen Fahrzeuge (gespeichert in der globalen Variable cars) gelöscht werden; zu diesem Zweck wird mittel for each über alle Fahrzeuge in cars iteriert und jedes Fahrzeug aus der Szene (dem panel – wir erinnern uns: der BorderContainer) mittels removeElement entfernt:
for each ( car in cars ) panel.removeElement( car );
Anschließend werden zwei benötigte Werte für die Neuerstellung der Szene berechnet; da wären zum einen die Anzahl der neu hinzuzufügenden Fahrzeuge numCars; sie berechnet sich aus dem Kreisumfang (perimeter), geteilt durch den einzuhaltenden Abstand der Fahrzeuge (dist.value; wir erinnern uns: dist ist der Schieberegler und dist.value der Wert des Schiebereglers) plus die Länge der Fahrzeuge selber – für unser Script soll jedes Fahrzeug “10” lang sein – wofür die 10 auch immer steht (für den Interessierten: gemeint sind natürlich Pixel). Der zweite Wert beschreibt, wie viel Grad Abstand die Fahrzeuge auf ihrer Kreisbahn jeweils voneinander haben und berechnet sich natürlich aus der Gesamtzahl der Grad im Kreis geteilt durch die Anzahl der Fahrzeuge:
var numCars:int = perimeter / ( dist.value + 10 ); var degreeInc:Number = 360 / numCars;
Diese Zeile beherbergt ein wenig Magie: sie sorgt dafür, dass die gespeicherte Menge aller Fahrzeuge geleert wird (bisher wurden die Fahrzeuge ja nur aus der Szene entfernt – gespeichert waren sie aber immer noch in der Variable cars):
cars = new Vector.<Car>();
Nun kommt der eigentlich interessante Code der reset-Funktion; im folgenden werden die einzelnen Fahrzeuge der Szene hinzugefügt. Hierzu benötigen wir eine Schleife, die so oft durchläuft, wie wir Fahrzeuge setzen wollen und dabei die Laufvariable i, beginnend bei 0, hochzählt:
for ( var i:int = 0; i < numCars; ++i ) {
Innerhalb der Schleife erstellen wir zunächst einmal ein neues Fahrzeug (was es genau mit dem Car auf sich hat, sehen wir wie gesagt in der nächsten Datei) und speichern es in der Variablen car:
car = new Car();
Das Fahrzeug verfügt über ein Attribut rotation, welches entsprechend des Namens seine Rotation angibt. Ein Fahrzeug ist in unserem Script nichts anderes als ein Rechteck; die Rotation des Fahrzeuges entspricht der Rotation des Rechtecks um seinen Mittelpunkt. Da wir die einzelnen Fahrzeuge genau auf einer Kreisbahn platzieren (wie die Platzierung erfolgt, sehen wir gleich noch), entspricht die Rotation genau ihrem Winkelabstand auf dem Kreis; das i-te Fahrzeug muss dabei also um degreeInc * i gedreht werden:
car.rotation = degreeInc * i;
Die letzten beiden Zeilen der reset-Funktion sorgen nun noch dafür, dass das erstelle Fahrzeug auch der Szene hinzugefügt (addElement) und in der cars-Variable gespeichert wird (push):
panel.addElement( car ); cars.push( car );
Die nächsten beiden Zeilen beenden die Schleife und die Funktion:
} }
Aufmerksame Leser werden sich nun natürlich fragen, wo denn die Position der Fahrzeuge gesetzt wird. Das habe ich in der Tat unterschlagen, oder, um genauer zu sein, gar nicht programmiert. Wie wir nämlich in der Datei Main.mxml bereits gesehen haben, wird in jedem Frame die Funktion update aufgerufen, und in dieser werden einfach die Positionen der Fahrzeuge gesetzt. Die folgende Zeile leitet ebenjene Funktion ein:
Kommentare (18)