10.2 Schleifen
Bei den Schleifen handelt es sich ebenfalls um Kontrollstrukturen: Solange eine Bedingung erfüllt ist, werden bestimmte Aktionen ausgeführt. Beim Sahneschlagen heißt es: So lange rühren, bis die Sahne steif ist (falls Sie aus einer eher südlichen Region kommen, dann heißt Sahne bei Ihnen eventuell Obers).
10.2.1 Endlosschleifen
Hier klicken, um das Bild zu Vergrößern
Abbildung 10.3
Meldung bei einer Endlosschleife
Es kann bei der Programmierung passieren, dass eine Schleife endlos ist oder dass zumindest Flash glaubt, in eine Endlosschleife geraten zu sein. Dies führt dann dazu, dass die Anweisungen in einer Schleife unendlich lange ausgeführt werden und den Computer so zum Stillstand bringen. Achten Sie aus diesem Grund immer darauf, dass Bedingungen wirklich zu einem Ende einer Schleife führen. Stellen Sie sich vor, Sie hätten beim Sahneschlagen eine Bedingung gewählt, die niemals eintreten kann. Dann müssten Sie ewig Sahne schlagen.
In Version 4 hat Flash die Ausführung von Aktionen im Falle einer Endlosschleife zum Schutz des Computers einfach abgebrochen. Seit Flash 5 erhält der Anwender eine wenig vertrauenserweckende Meldung (siehe Abbildung 10.3). Übrigens: Grundsätzlich vermutet Flash nach ungefähr 15 Sekunden ununterbrochener Schleifenausführung, dass es sich um eine Endlosschleife handelt.
Neben den Endlosschleifen gibt es auch noch endlose Rekursionen. Dabei handelt es sich um Funktionen, die sich immer wieder selber aufrufen. Sollten mehr als 256 Aufrufe stattfinden, erkennt Flash dies und gibt innerhalb des Testmodus die folgende Meldung im Ausgabefenster aus – im Browser wird die Ausfuehrung von ActionScript kommentarlos beendet:
256 Rekursionsstufen wurden in einer Aktionsliste überschritten.
Es handelt sich wahrscheinlich um eine Endlosschleife.
In diesem Film werden keine weiteren Aktionen ausgeführt.
10.2.2 while
Hier klicken, um das Bild zu Vergrößern
Abbildung 10.4
Abarbeitung der Aktionen in einer Schleife (while)
Auf Deutsch bedeutet while so viel wie solange. Ein Satz wie »Solange ich nicht am Ziel bin, gehe ich einen Schritt weiter« sähe in ActionScript ungefähr so aus (das »Nicht« wird übrigens durch das Ausrufezeichen ausgedrückt):
while (!amZiel) {
ich.geheEinenSchritt();
}
Die Anweisung while finden Sie innerhalb des ActionScript-Editors unter Anweisungen • Bedingungen/Schleifen. Diese Anweisung signalisiert, dass die ihr folgenden Befehle so lange ausgeführt werden, wie die angegebene Bedingung wahr (true) ist. Als Bedingung geben Sie einen beliebigen Ausdruck an, dessen Ergebnis ein boolescher Wert ist (true oder false).
Die von der Bedingung abhängigen Befehle werden innerhalb von geschweiften Klammern bestimmt. Sollten Sie nur eine einzige Aktion angeben, dann dürfen Sie auf die geschweiften Klammern verzichten und anstelle von
while (!amZiel) {
ich.geheEinenSchritt();
}
ebenfalls das Folgende schreiben:
while (!amZiel) ich.geheEinenSchritt();
Beachten Sie unbedingt, dass Flash den Bildschirm während der Abarbeitung einer Kontrollstruktur nicht aktualisiert. Aus diesem Grund macht es u.a. keinen Sinn, eine kontinuierliche Bewegung mit der Hilfe einer Schleife umzusetzen!
10.2.3 do while
Das do while unterscheidet sich vom while nur dadurch, dass Flash zuerst die Anweisungen ausführt und dann die Bedingung überprüft. Bei while wird zuerst die Bedingung überprüft und dann der Block mit den Anweisungen abgearbeitet!
do {
ich.geheEinenSchritt();
} while (!amZiel);
Die von der Bedingung abhängigen Befehle werden innerhalb von geschweiften Klammern bestimmt. Sollten Sie nur eine einzige Aktion angeben, dann dürfen Sie auf die geschweiften Klammern verzichten und anstelle von
do {
ich.geheEinenSchritt();
} while (!amZiel);
ebenfalls
do ich.geheEinenSchritt(); while (!amZiel);
schreiben!
10.2.4 for
Die Anweisung for finden Sie wie alle anderen Kontrollstrukturen innerhalb des ActionScript-Editors unter Anweisungen • Bedingungen/Schleifen. Diese Anweisung ermöglicht es ähnlich der Aktion while, Befehle so lange auszuführen, bis eine Bedingung nicht mehr wahr (true) ist. Als Bedingung geben Sie einen beliebigen Ausdruck an, dessen Ergebnis ein boolescher Wert ist (true oder false). Zusätzlich dürfen Sie noch einen Ausdruck für die Initialisierung angeben. Der dritte Parameter beschreibt einen Ausdruck, der nach jedem Schleifendurchlauf ausgeführt wird. Die von der Bedingung abhängigen Befehle werden innerhalb von geschweiften Klammern bestimmt. Sollten Sie nur einen einzigen Befehl angeben, dann dürfen Sie auf die geschweiften Klammern verzichten.
Das folgende Skript erzeugt mit Hilfe einer for-Schleife einen Sternenhimmel aus vielen Sternen, die jeweils zufällig positioniert werden:
var i;
02_Programmierung\Sternenhimmel
var x;
var y;
var mc;
var anzahl;
anzahl = 100;
for (i=0; i<anzahl; i++) {
// Ermittle zufällige Position
x = Math.random()*Stage.width;
y = Math.random()*Stage.height;
// Erzeuge Stern
mc = _root.attachMovie("stern", "stern"+String(i), i);
mc._x = x;
mc._y = y;
}
for-Schleifen lassen sich durch while-Schleifen simulieren. Anstelle von
for (initialisierung; bedingung; weiter) {
// Anweisungen;
}
schreiben Sie:
initialisierung;
while (bedingung) {
// Anweisungen;
weiter;
}
Beachten Sie unbedingt auch für die for-Schleife, dass Flash den Bildschirm während der Abarbeitung einer Kontrollstruktur nicht aktualisiert. Aus diesem Grund macht es u.a. keinen Sinn, eine kontinuierliche Bewegung mit der Hilfe einer Schleife umzusetzen!
10.2.5 for in
Das for in ist eine besondere Art der Schleife. Mit dieser Anweisung ist es möglich, eine Schleife über alle Bestandteile eines Objektes durchzuführen. So als ob Sie sagen würden: Für alle Einträge in meinem Adressbuch verschicke eine Einladung:
// bewege alle MovieClips im _root auf der x-Achse um 100 Pixel
for (var i in _root) {
trace(i);
var obj = _root[i];
if (typeof obj == "movieclip") {
obj._x = obj._x+100;
}
}
10.2.6 break
Die Anweisung break beendet eine Schleife. Dies wird gerne dazu benutzt, um die Ausführung einer Schleife abzubrechen, sobald das gewünschte Ergebnis gefunden ist, um unnötige weitere Schleifendurchläufe zu vermeiden. Zwar ließe sich dies auch mit Bedingungen nachmodellieren, doch die break-Variante ist beliebter, da sie meist besser lesbar ist:
adressen = ["Sascha", "Marc", "Peter", "Sandra"];
for (var i in adressen) {
if (adressen[i] == "Marc") {
trace(adressen[i]);
break;
}
trace("kein Marc");
}
10.2.7 continue
Die continue-Anweisung ist dem break sehr ähnlich, beendet jedoch nicht die gesamte Schleife, sondern nur den aktuellen Schleifendurchlauf und setzt die Schleife mit dem nächsten Wert fort.
adressen = ["Sascha", "Marc", "Peter", "Sandra"];
// Finde den ersten Namen, der mit S beginnt
for (var i = 0; i<adressen.length; i++) {
if (adressen[i].substr(0, 1) == "S") {
trace(adressen[i]);
break;
}
trace("ohne S");
}
// Finde alle Namen, die mit S beginnen
for (var i = 0; i<adressen.length; i++) {
if (adressen[i].substr(0, 1) == "S") {
trace(adressen[i]);
continue;
}
trace("ohne S");
}
|