Skip to content

2.1 Wiederholungen

Im vorherigen Kapitel haben wir eine Landschaft erstellt, allerdings ist diese noch sehr statisch. Jetzt soll diese Szene animiert werden, beginnend mit einem Apfel, der am Baum hängt und herunterfällt.

Wie kann das erreicht werden? Beim Herunterfallen des Apfels ändert sich der Zustand des SGKreis-Objekts: Die y-Koordinate erhöht sich. Dies kann mit der Methode verschiebe(double,double) erreicht werden, wobei der erste Wert die Verschiebung in x-Richtung ist (hier 0) und der zweite Wert die Verschiebung in y-Richtung. Damit die Bewegung möglichst flüssig ist, könnten die Anweisungen so aussehen:

2.1 Wiederholungen

apfel.verschiebe(0,2);
SGSystem.warte();
apfel.verschiebe(0,2);
SGSystem.warte();
apfel.verschiebe(0,2);
SGSystem.warte();
....

2.1 Wiederholungen

Hinweis

Die Rechenleistung von Computern ist so groß, dass unsere Programme in rasender Geschwindigkeit ausgeführt werden können. Daher muss man den Computer bremsen, damit das menschliche Auge die Animation auch wahrnehmen kann.
Mit SGSystem.warte() zwingt man den Computer, eine Pause einzulegen. Diese ist genau so lang, dass die Bildrate 45 Bilder pro Sekunde (frames per second) beträgt.

Dieser Ansatz ist mit Copy & Paste schnell umgesetzt, hat allerdings entscheidende Nachteile: Wenn man nachträglich etwas ändern möchte, muss man das an allen Stellen tun. Der dahinter stehende Gedanke – die mehrfache Wiederholung einer Anweisung – lässt sich daher viel eleganter umsetzen, und zwar mit einer while-Schleife.

Eine Schleife wird durch das Schlüsselwort while eingeleitet und erfordert eine Bedingung. Diese Bedingung wird bei der Verarbeitung der Schleife überprüft. Solange sie erfüllt ist, wird der Anweisungsblock wiederholt ausgeführt.

while ( Bedingung )
{
    // Anweisungsblock
}

Für unser Beispiel mit dem fallenden Apfel ergibt sich der folgende Pseudocode:
wiederhole solange die y-Koordinate des Apfels kleiner als 390 ist
     verschiebe den Apfel um 2 Pixel nach unten
    warte einen Moment
ende wiederhole

Wichtig

In der Programmierung führt Copy & Paste immer zu schlechtem Code und sollte vermieden werden! In den folgenden Kapiteln werden viele Möglichkeiten aufgezeigt, wie das geht.

Dieser Pseudocode wird häufig auch übersichtlich als Struktogramm dargestellt. Bei dieser graphischen Darstellung erhält jede Anweisung einen eigenen Strukturblock. Für die Kontrollstrukturen gibt es spezielle Strukturblöcke: Schleifen werden als „gedrehtes L“ dargestellt. Alle Anweisungen, die sich im Schleifenrumpf befinden, werden hier eingerückt. In Fall unseres Beispiels sähe das Struktogramm so aus:

2.1 Wiederholungen

Um dieses Struktogramm in Java-Quelltext zu übersetzen, muss man in die Dokumentation der SGE-Bibliothek schauen: Genauso, wie Methoden zum Setzen von Farbe, Ebene, Drehung usw. existieren (sogenannte Aufträge), gibt es auch Methoden, um den Zustand eines Objekts abzufragen (sogenannte Anfragen). Mit diesen Methoden kann man sich die Drehung, Position, Sichtbarkeit usw. eines Objekts geben lassen. Sie sind leicht an ihrem Namen zu erkennen, da sie in den meisten Fällen mit gib oder ist beginnen.

Die Methode gibY() können wir also für die Bedingung der while-Schleife benutzen: Solange die y-Position des Apfels, die mit apfel.gibY() abgefragt wird, kleiner als 390 ist, wird der Apfel um 2 Pixel nach unten bewegt.

Der zugehörige Quelltext könnte so aussehen:

    public void lasseApfelFallen()
{
   while( apfel.gibY() < 390 )
   {
      apfel.verschiebe(0,2);
      SGSystem.warte();
   }
}   
            
                    
        

Hinweis

Eine detaillierte Erklärung der Struktogramme findet sich im Anhang.

Hinweis

Eine Schleife besteht aus dem Schleifenkopf und dem Schleifenrumpf. Im nebenstehenden Beispiel ist die Zeile while( apfel.gibY() < 390 ) der Schleifenkopf. Zum Schleifenrumpf gehören alle Anweisungen, die sich zwischen den geschweiften Klammern befinden, die zu der Schleife gehören.

Bedingungen und Vergleichsoperatoren

Bedingungen (wie apfel.gibY() < 390) bestehen aus zwei Ausdrücken (in diesem Fall apfel.gibY() und 390), zwischen denen sich ein Vergleichsoperator befindet.

Sie müssen den Wert true (wahr) oder false (falsch) liefern. Bei Schleifen werden bei Erfüllen der Bedingung (true) die Anweisungen des Schleifenrumpfes ausgeführt. Ist die Bedingung nicht erfüllt (false), werden diese Anweisungen übersprungen.

Liste der Vergleichsoperatioren

==   Liefert true, wenn die beiden Ausdrücke gleich sind.
!=    Liefert true, wenn die beiden Ausdrücke ungleich sind.
<     Liefert true, wenn der linke Ausdruck kleiner als der rechte ist.
>     Liefert true, wenn der linke Ausdruck größer als der rechte ist.
<=   Liefert true, wenn der linke Ausdruck kleiner oder gleich dem rechten ist.
>=   Liefert true, wenn der linke Ausdruck größer oder gleich dem rechten ist.

Aufgaben

1. Bedingungen überprüfen
Überprüfe, ob es sich in den folgenden Fällen um eine Bedingung handelt:
(1) einKreis.gibX() < 15
(2) 42 != nochEinKreis.gibY()
(3) 5 < meinRechteck.gibBreite() < 10
(4) deinRechteck.gibEbene()
(5) meinDreieck.gibY() < deinDreieck.gibY()

2. Bedingungen analysieren
Erkläre die Bedeutung der folgenden Bedingungen:
(1) meinKreis.gibX() < 15
(2) einDreieck.gibEbene() != 3
(3) meinRechteck.gibBreite() >= 2
(4) nochEinKreis.istSichtbar() == false
(5) !(deinRechteck.gibY() >= 40)
Gib abschließend eine vereinfachte Bedingung für (5) an.

3. Quelltext analysieren
Analysiere die folgende Methode, indem du sie zeilenweise kommentierst und abschließend beschreibst, was die Methode bewirkt:

    public void animiere()
{
	while( fluegel1.gibDrehung() < 300 )
	{
		fluegel1.drehe(2);
		fluegel2.drehe(2);
		SGSystem.warte();
	}
}   
            
                    
        
windrad

4. Newton läßt grüßen
Implementiere das obige Beispiel mit dem Apfel. Deklariere dazu eine Objektvariable apfel und initialisiere ein SGKreis-Objekt mit passenden Werten. Füge anschließend die Methode lasseApfelFallen() hinzu.

5. Rauch steigt auf
Implementiere analog zum Apfel eine Rauchwolke über dem Schornstein, die langsam aufsteigt.
Hinweis: Die Rauchwolke kann auch mit steigender Höhe verblassen. Mit der folgenden Anweisung kann die Transparenz um 0.01 verringert werden:

    rauch.setzeTransparenz(rauch.gibTransparenz() - 0.01);   
            
                    
        

Zusatzaufgabe
Füge deiner Landschaft weitere Animationen hinzu, z.B. ziehende Wolken, fahrende Autos, eine untergehende Sonne.