Nun kommt das eigentlich interessante. Die folgende Zeile beschreibt den Knopf oben links im Flash-Script, mit welchem sich die Fahrzeuge zurücksetzen lassen. Das interessanteste an dieser Zeile ist das Attribut click=”reset()” – es sorgt dafür, dass beim Klicken des Buttons die Funktion reset aufgerufen wird (deren Beschreibung folgt in der nächsten Datei):
<s:Button label="Fahrzeuge zurücksetzen" click="reset()" />
Diese Zeile ist vergleichsweise langweilig und fügt nur den Text “Mindestabstand:” in das Script ein:
<s:Label text="Mindestabstand:"/>
Diese Zeile ist nun wieder interessanter; sie generiert den Schieberegler mit seinen verschiedenen Informationen wie Minimalwert (minimum), Maximalwert (maximum), Schrittweite (stepSize) und Anfangswert (value). Das Attribut change=”reset()” sorgt, ähnlich wie beim oben beschriebenen Button, dafür, dass bei Änderungen am Schieberegler die Methode reset aufgerufen wird. Wichtig ist auch id=”dist”, denn hiermit wird dem Schieberegler ein Name (nämlich dist) gegeben, über welchen er später wieder angesprochen und sein Wert abgefragt werden kann:
<s:HSlider id="dist" minimum="5" maximum="50" stepSize="5" value="20" change="reset()" />
Auch diese Zeile ist eher langweilig und definiert einen weiteren Textbereich. Einigermaßen interessant ist hier vor allem das Attribut text=”{dist.value}” – es besagt, dass der anzuzeigende Text genau dem Wert des Schiebereglers entsprechen soll (wir erinnern uns: der Schieberegler trägt den Namen dist, welcher wiederum über ein Attribut value verfügt):
<s:Label text="{dist.value}" />
Diese Zeile beendet lediglich die horizontale Gruppe.
</s:HGroup>
Das zweite Element der vertikalen Gruppe ist ein sogenannter BorderContainer; damit ist im Grunde eine umrahmte Fläche ohne einen genau spezifizierten Anwendungszweck gemeint. Der BorderContainer verfügt über eine Breite (width) und Höhe (height), beides jeweils mit dem Wert 400, ebenso wieder über einen Namen (diesmal “panel“). Interessant sind auch die letzten beiden Attribute: mit addedToStage=”reset()” wird angegeben, dass zu Beginn der Anwendung wieder einmal die reset-Funktion aufgerufen wird; noch wichtiger ist das Attribut enterFrame=”update()” – es bewirkt, dass in jedem Frame (also jedem zu zeichnenden Bild – wir erinnern uns) die Methode update aufgerufen wird (was sie tut, werden wir auch gleich noch sehen):
<s:BorderContainer id="panel" width="400" height="400" addedToStage="reset()" enterFrame="update()" />
Der Rest der Datei ist langweilig, denn er beendet nur die vertikale Gruppe…
</s:VGroup>
…und die Anwendung an sich:
</s:Application>
Die nächste Datei wurde bereits erwähnt; sie enthält die für die Anwendung relevante Logik, beschreibt also, was wir genau tun wollen (nämlich die Fahrzeuge auf den Bildschirm malen). Und so sieht sie aus:
Main.as:
private var radius:int = 180; private var perimeter:int = 2 * Math.PI * radius; private var cars:Vector.<Car> = new Vector.<Car>(); public function reset() : void { var car:Car; for each ( car in cars ) panel.removeElement( car ); var numCars:int = perimeter / ( dist.value + 10 ); var degreeInc:Number = 360 / numCars; cars = new Vector.<Car>(); for ( var i:int = 0; i < numCars; ++i ) { car = new Car(); car.rotation = degreeInc * i; panel.addElement( car ); cars.push( car ); } } public function update() : void { for ( var i:int = 0; i < cars.length; ++i ) { var car:Car = cars[i]; var nextCar:Car = ( i < cars.length - 1 ) ? cars[i + 1] : cars[0]; car.rotation += car.calcSpeed( nextCar, dist.value * 0.9 ); var circleRot:Number = car.rotation * Math.PI / 180; car.x = 200 + Math.cos( circleRot ) * -radius; car.y = 200 + Math.sin( circleRot ) * -radius; } }
Gehen wir auch hier die Zeilen im einzelnen durch. In den ersten drei Zeilen werden drei globale (das heißt, überall verfügbare) Variablen definiert. Die ersten beiden dienen der Visualisierung und beschreiben den Radius des Kreisen, den wir zeichnen wollen, sowie den Umfang ebenjenen Kreises (der sich, wie wir alle wissen, zu u = 2 * π * r berechnet); die dritte Variable ist schließlich eine Menge von Fahrzeugen (im Informatik-Bereich als Vector bezeichnet – bitte nicht mit dem Vektor aus der Mathematik verwechseln, denn obschon eine gewisse Ähnlichkeit der beiden Konzepte besteht, hat der Informatik-Vektor einen entscheidenden Vorteil: seine Größe ist änderbar). Was genau ein Fahrzeug (im Code mit Car bezeichnet) ist, werden wir in der nächsten Datei noch sehen:
Kommentare (18)