Skip to content

1.3 Die Landschaft – das erste Programm

Bisher haben wir Funktionen der Entwicklungsumgebung BlueJ genutzt, die eine professionelle Entwicklungsumgebung nicht bietet. Die Objektanzeige und die Direkteingabe unterstützen uns im Verstehen der Objektorientierung – für das Schreiben von Programmen sind sie aber nicht geeignet: Eingaben werden nicht gespeichert. Um die gleiche Ausgangssituation und die gleichen Veränderungen noch einmal zu erzeugen, müssen alle Schritte erneut durchgeführt werden. Daher werden wir als nächstes ein Programm erstellen, dass diese Schritte automatisch ausführt, wenn wir es aufrufen.

Dabei müssen zwei Fragen beantwortet werden:

  1. Was für Objekte werden für die Szene benötigt?
  2. Mit welchen Werten müssen die Objekte erzeugt werden?

Für unser erstes Projekt Landschaft bedeutet dies ganz konkret:

  1.  Es sind drei Objekte beteiligt: ein SGLeinwand-Objekt, ein SGRechteck-Objekt und ein SGKreis-Objekt.
  2. Die Leinwand hat eine blaue Hintergrundfarbe, das Rechteck ist gefüllt, grün und befindet sich am unteren Ende der Leinwand. Der Kreis befindet sich oben rechts in der Ecke und ist gelb und gefüllt.

Erstelle ein neues Projekt 1-3 Landschaft. Erstelle dann mit der entsprechenden Schaltfläche neben der Klassenansicht eine neue Klasse und nenne diese Landschaft. Achte darauf, dass bei Art der Klasse die Option SGE angewählt ist.
Führe dann einen Doppelklick auf die Klassenkarte aus, die nun in der Klassenansicht zu sehen ist. Dadurch öffnet sich der Editor für den Quelltext dieser Klasse.

1.3 Die Landschaft – das erste Programm
1.3 Die Landschaft – das erste Programm

Schritt 1: Objekte deklarieren

Bei der Arbeit mit der Objektanzeige und der Direkteingabe haben wir bereits Objekte deklariert. Diese Deklaration von Objektvariablen müssen wir auch im Quelltext für unsere Landschaftsszene vornehmen.

Mit der Deklaration werden für die Objektvariable der Name (auch Bezeichner genannt) und die Klasse, die zum Erzeugen dieses Objekts dient, festgelegt.

Da als Vorlage zur Erstellung der Klasse Landschaft die SGE-Vorlage ausgewählt wurde, finden sich bereits Anweisungen im Quelltext. In der dritten Zeile findet sich der Klassenkopf. Alle Anweisungen, die nun folgen und von den geschweiften Klammern in Zeile 4 und 13 eingefasst werden, gehören zur Klasse Landschaft.

Eine Objektvariable wird bereits in Zeile 5 deklariert: ein SGLeinwand-Objekt mit dem Namen meineLeinwand. Die Deklaration von Variablen folgt immer dem gleichen Prinzip: Zuerst wird der (Daten-)Typ genannt, gefolgt vom Namen (Bezeichner) der Variablen:
private datentyp bezeichner;

Ergänze unterhalb der Deklaration für die Leinwand die Deklaration für den Boden und die Sonne:
private SGKreis sonne;
private SGRechteck boden;

Auf die Bedeutung der Zugriffsmodifizierer private und public wird später eingegangen. Grundsätzlich gilt: Attribute werden nie public deklariert.

1.3 Die Landschaft – das erste Programm

Hinweis

Mit der Anweisung import SGE.*; in Zeile 1 kann man Anweisungen im Quelltext abkürzen: Statt SGE.SGKreis kann man nun einfach SGKreis schreiben.

Hinweis

Möchte man mehrere Objekte der gleichen Klasse deklarieren, kann man die Objektnamen einfach mit einem Komma trennen und braucht nur einmal den Datentyp zu nennen:
private SGKreis einKreis, nochEinKreis;

Schritt 2: Objekte erzeugen

Wie bereits beschrieben werden bei der Deklaration von Objektvariablen nur die Namen reserviert. Das Erzeugen der Objekte (Fachbegriff: Initialisierung) muss noch erfolgen. Für das SGLeinwand-Objekt ist die Anweisung bereits in Zeile 9 zu finden: Mit

meineLeinwand = new SGLeinwand(800,600);

wird ein SGLeinwand-Objekt erzeugt und eine Referenz auf dieses Objekt in der entsprechenden Objektvariablen gespeichert.

Ergänze unterhalb der Initialisierung der Leinwand die Initialisierung für den Boden und die Sonne:
boden = new SGRechteck(0,400,500,100);
sonne = new SGKreis(380,30,40);

Hinweis

Der Name des Konstruktors einer Klasse ist immer der gleiche wie der Klassenname. Die Klasse Landschaft hat als Konstruktor die Methode Landschaft().
Ein Konstruktor kann auch Parameter haben, wie beispielsweise die Klasse SGKreis. Hier werden beim Erzeugen als Parameter die x- und y-Koordinate und der Radius erweitert.

Anders als der SGKreis benötigt die Erzeugung eines SGRechteck-Objekts vier Parameter in der folgenden Reihenfolge: Die x- und y-Koordinate der oberen linken Ecke, die Breite des Rechtecks und abschließend die Höhe des Rechtecks.

Zusätzlich muss noch der Zustand für die jeweiligen Objekte geändert werden, damit er den Vorgaben entspricht.

Modifiziere die Erzeugung der Leinwand, dass sie 500 Pixel breit und 500 Pixel hoch ist. Ändere dann die Werte für die Hintergrundfarbe auf (0,0.8,1.0). Ergänze innerhalb des gelben Blocks die folgenden Anweisungen:
boden.setzeFuellung(true);
boden.setzeFarbe(0,0.8,0.25);
sonne.setzeFuellung(true);
sonne.setzeFarbe(1,1,0);

Alle Anweisungen zur Erzeugung und Veränderung der Objekte stehen in einer besonderen Methode der Klasse Landschaft: dem Konstruktor. Die Anweisungen in diesem Block werden ausgeführt, wenn ein Objekt der Klasse Landschaft mit new Landschaft() erzeugt wird. Leinwand, Sonne und Boden werden also erzeugt, wenn auch ein Landschaft-Objekt erzeugt wird.

Kehre in das Hauptfenster von BlueJ zurück und klicke auf die Schaltfläche Übersetzen. Klicke dann mit einem Rechtsklick auf Landschaft und wähle new Landschaft(), um den Konstruktor aufzurufen. Klicke im Dialog auf Ok.

1.3 Die Landschaft – das erste Programm

Weitere Methoden hinzufügen

Um die Landschaft zu erweitern, soll im folgenden ein Wechsel zwischen Tag und Nacht programmiert werden: Wenn es Nacht wird, muss die gesamte Landschaft „abgedunkelt“ werden und die Sonne „verschwinden“.

Dieses Verhalten soll in einer Methode mit dem Namen werdeNacht() implementiert werden. Neben dem Ändern der Farbe durch den Aufruf der Methode setzeFarbe(double, double, double) für das Objekt boden muss die Methode setzeSichtbar(boolean) für das Objekt sonne aufgerufen werden. Abschließend sollte die Hintergrundfarbe des Objekts meineLeinwand abgedunkelt werden. In der Methode werdeTag() werden die Änderungen wieder rückgängig gemacht.

Wechsle zurück zum Quelltext der Klasse Landschaft. Ergänze unterhalb des Konstruktors die Methoden werdeNacht() und werdeTag() anhand der Vorgaben.

    public void werdeNacht()
{
	boden.setzeFarbe(0, 0.4, 0.125);
	sonne.setzeSichtbar(false);
	meineLeinwand.setzeHintergrundfarbe(0, 0.4, 0.5);
}

public void werdeTag()
{
	boden.setzeFarbe(0, 0.8, 0.25);
	sonne.setzeSichtbar(true);
	meineLeinwand.setzeHintergrundfarbe(0, 0.8, 1.0);
}   
            
                    
        

Vererbung in der SGE-Bibliothek

Die Klassen in der SGE-Bibliothek nutzen Vererbung, auf die später noch eingegangen wird. Vorerst reicht es zu wissen, dass die Klasse SGKreis, SGRechteck, SGDreieck und SGEllipse Methoden und Attribute von den Klassen SGFigur und SGObjekt erben. Ein Objekt der Klasse SGKreis kann also nicht nur Methoden dieser Klasse aufrufen, sondern auch alle Methoden der Klassen SGFigur und SGObjekt.

1.3 Die Landschaft – das erste Programm

Man nutzt Vererbung, um den Programmieraufwand zu verringern: Beispielsweise ist die Methode setzeFuellung(boolean) in der Klasse SGFigur programmiert. Damit verfügen alle Klassen, die von dieser Klasse erben, auch über diese Methode. Sie muss also nur einmal programmiert werden, kann aber für die Klassen SGKreis, SGRechteck usw. genutzt.

Aufgaben

1. Die SGE-Dokumentation
Im Anhang findet sich die Dokumentation der SGE-Bibliothek, in der die Klassen und ihre Methoden vorgestellt werden. Mache dich mithilfe der Dokumentation mit den Klassen SGObjekt, SGFigur, SGKreis, SGDreieck, SGRechteck und SGDreieck vertraut. Du brauchst die Methoden nicht auswendig lernen, da du immer auf die Dokumentation zurückgreifen kannst, aber es ist sinnvoll zu wissen, welche Möglichkeiten man hat, die erstellten Objekte zu beeinflussen.

2. Das Projekt Landschaft
a) Vervollständige das Projekt Landschaft, indem du das Haus und den Baum implementierst.
b) Erweitere die Methoden werdeNacht() und werdeTag(), so dass auch für das Haus und den Baum die Farbänderungen erfolgen.
c) Implementiere die Wolke oder andere Objekte im Projekt Landschaft.