Damit haben wir also nun die neue Position des Fahrzeuges berechnet; bleibt nur noch, die Schleife und die update-Funktion zu beenden, was die folgenden Zeilen tun:
} }
Die eigentliche Programmlogik ist nun also beschrieben. Fehlen nur noch Informationen über diese ominösen Fahrzeuge und vor allem die Funktion calcSpeed. Diese finden sich in der letzten Datei:
Car.as
package { import spark.primitives.Rect; import mx.graphics.SolidColor; public class Car extends Rect { public var speed:Number = 0; public var color:SolidColor; public var reactionTime:Number; public function Car() { reactionTime = 1.0 - Math.random() / 10.0; width = 5; height = 10; color = new SolidColor(); fill = color; } public function calcSpeed( nextCar:Car, distanceToKeep:Number ):Number { var distToNext:Number = Math.sqrt( ( nextCar.x - x ) * ( nextCar.x - x ) + ( nextCar.y - y ) * ( nextCar.y - y ) ) - 10; if ( distToNext > distanceToKeep ) { if ( speed < 0.5 ) speed += 0.01 * reactionTime; } else if ( distToNext < distanceToKeep ) { if ( speed > 0 ) speed -= 0.02 * reactionTime; if ( speed < 0 ) speed = 0; } color.color = ( ( 255 * ( 1 - speed ) ) << 16 | ( 255 * speed ) << 8 ); if ( distToNext + 10 < 12 ) speed = 0; return speed; } } }
Schauen wir uns also nun zum Abschluss auch diese Datei noch zeilenweise an. Sie beginnt mit diesen technisch motivierten Zeilen, die uns an dieser Stelle nicht weitere interessieren sollen:
package { import spark.primitives.Rect; import mx.graphics.SolidColor;
Die erste interessante Zeile ist die folgende. In ihr wird ein neuer Datentyp mit der Bezeichnung Car definiert; der Zusatz extends Rect bedeutet dabei, dass dieses Fahrzeug eigentlich ein Rechteck (von englisch rect = rectangle) mit all seinen Eigenschaften ist (wenn Interesse daran besteht, einen Artikel zu diesem Thema – der sogenannten Objektorientierung – zu haben, bitte Bescheid sagen). Dieser Datentyp wurde in der Datei Main.as bereits mehrfach referenziert und sollte mittlerweile bekannt sein:
public class Car extends Rect {
Die folgenden 3 Zeilen definieren einige Attribute für die Fahrzeuge (zusätzlich zu denen, die es bereits in seiner Eigenschaft als Rechteck hat). Das wichtigste Attribut ist hier natürlich die Geschwindigkeit (speed). color dient lediglich der Einfärbung der Fahrzeuge und soll hier nicht weiter interessieren. Das Attribut reactionTime dagegen benötigen wir; es simuliert eine Reaktionszeit des Fahrzeuges beim Beschleunigen und Bremsen und sorgt für etwas Variation zwischen den verschiedenen Fahrzeugen (mehr dazu weiter unten):
public var speed:Number = 0; public var color:SolidColor; public var reactionTime:Number;
Diese Funktion des Fahrzeuges, die den gleichen Namen wie der Datentyp trägt, ist ein sogenannter Konstruktor; er wird automatisch aufgerufen, sobald ein neues Objekt des Datentyps erstellt wird. Innerhalb des Fahrzeug-Konstruktors initialisieren wir einige Variablen mit Standardwerten; die reactionTime bekommt dabei einen Zufallswert im Intervall [0.9, 1], die Breite und Höhe des Fahrzeuges (als Attribute des zugrundeliegenden Rechtecks) werden auf 5 bzw. 10 gesetzt (die 10 entspricht dabei der Länge des Fahrzeugs) und die Sache mit den Farben ist technischer Natur und soll hier nicht weiter interessieren:
public function Car() { reactionTime = 1.0 - Math.random() / 10.0; width = 5; height = 10; color = new SolidColor(); fill = color; }
Die eigentlich interessante Funktion ist calcSpeed; sie berechnet für das aktuelle Fahrzeug die Geschwindigkeit in Abhängigkeit von der aktuellen Geschwindigkeit, der Distanz zum nächsten Fahrzeug (gegeben über den Parameter nextCar) und die einzuhaltende Distanz (distanceToKeep) und stellt damit eine primitive Form einer künstlichen Intelligenz dar. Die folgende Codezeile leitet die Funktion ein:
Kommentare (18)