4.1 Siedlung am Wald
Die Aufgabe, mehrere Häuser und Bäume zu erstellen, kann auf unterschiedliche Arten gelöst werden. Zwei Möglichkeiten werden unten dargestellt, wobei in den folgenden Quelltexten nur die Häuser erstellt werden.

Möglichkeit 1
Diese Variante entspricht der Vorgehensweise, die wir bisher gewählt haben: Es gibt eine Klasse, in der alle Objekte deklariert und erstellt werden.

public class Entwurf1
{
private SGLeinwand meineLeinwand;
private SGRechteck erdgeschoss1, schornstein1,
fenster1, tuer1;
private SGRechteck erdgeschoss2, schornstein2,
fenster2, tuer2;
private SGRechteck erdgeschoss3, schornstein3,
fenster3, tuer3;
private SGRechteck erdgeschoss4, schornstein4,
fenster4, tuer4;
private SGDreieck dach1, dach2,
dach3, dach4;
private SGRechteck boden;
public Entwurf1()
{
meineLeinwand = new SGLeinwand(800,500);
meineLeinwand.setzeHintergrundfarbe(0, 0.8, 1.0);
boden = new SGRechteck(0,400,800,200);
boden.setzeFuellung(true);
boden.setzeFarbe(0.4,1,0.4);
boden.setzeEbene(0);
erdgeschoss1 = new SGRechteck(20,380,60,60);
erdgeschoss1.setzeFuellung(true);
erdgeschoss1.setzeFarbe(1,0,0);
dach1 = new SGDreieck(15,380,85,380,50,340);
dach1.setzeFuellung(true);
dach1.setzeFarbe(0,0,0);
schornstein1 = new SGRechteck(30,345,10,20);
schornstein1.setzeFuellung(true);
schornstein1.setzeFarbe(1,0,0);
fenster1 = new SGRechteck(30,390,20,20);
fenster1.setzeFuellung(true);
fenster1.setzeFarbe(0.6,0.6,1);
fenster1.setzeEbene(2);
tuer1 = new SGRechteck(53,395,20,45);
tuer1.setzeFuellung(true);
tuer1.setzeFarbe(0.8,0.6,0.5);
tuer1.setzeEbene(2);
erdgeschoss2 = new SGRechteck(90,390,60,60);
erdgeschoss2.setzeFuellung(true);
erdgeschoss2.setzeFarbe(1,0,0);
dach2 = new SGDreieck(85,390,155,390,120,350);
dach2.setzeFuellung(true);
dach2.setzeFarbe(0,0,0);
schornstein2 = new SGRechteck(100,355,10,20);
schornstein2.setzeFuellung(true);
schornstein2.setzeFarbe(1,0,0);
fenster2 = new SGRechteck(100,400,20,20);
fenster2.setzeFuellung(true);
fenster2.setzeFarbe(0.6,0.6,1);
fenster2.setzeEbene(2);
tuer2 = new SGRechteck(123,405,20,45);
tuer2.setzeFuellung(true);
tuer2.setzeFarbe(0.8,0.6,0.5);
tuer2.setzeEbene(2);
erdgeschoss3 = new SGRechteck(150,380,60,60);
erdgeschoss3.setzeFuellung(true);
erdgeschoss3.setzeFarbe(1,0,0);
dach3 = new SGDreieck(145,380,215,380,180,340);
dach3.setzeFuellung(true);
dach3.setzeFarbe(0,0,0);
schornstein3 = new SGRechteck(160,345,10,20);
schornstein3.setzeFuellung(true);
schornstein3.setzeFarbe(1,0,0);
fenster3 = new SGRechteck(160,390,20,20);
fenster3.setzeFuellung(true);
fenster3.setzeFarbe(0.6,0.6,1);
fenster3.setzeEbene(2);
tuer3 = new SGRechteck(183,395,20,45);
tuer3.setzeFuellung(true);
tuer3.setzeFarbe(0.8,0.6,0.5);
tuer3.setzeEbene(2);
erdgeschoss4 = new SGRechteck(230,390,60,60);
erdgeschoss4.setzeFuellung(true);
erdgeschoss4.setzeFarbe(1,0,0);
dach4 = new SGDreieck(225,390,295,390,260,350);
dach4.setzeFuellung(true);
dach4.setzeFarbe(0,0,0);
schornstein4 = new SGRechteck(240,355,10,20);
schornstein4.setzeFuellung(true);
schornstein4.setzeFarbe(1,0,0);
fenster4 = new SGRechteck(240,400,20,20);
fenster4.setzeFuellung(true);
fenster4.setzeFarbe(0.6,0.6,1);
fenster4.setzeEbene(2);
tuer4 = new SGRechteck(263,405,20,45);
tuer4.setzeFuellung(true);
tuer4.setzeFarbe(0.8,0.6,0.5);
tuer4.setzeEbene(2);
}
}
Möglichkeit 2
Bei dieser Variante besteht das Projekt aus zwei Klassen. Neben der Klasse Entwuf2
wird zusätzlich die Klasse Haus
programmiert. Diese kann dann in der Klasse Entwurf2
benutzt werden. Dies deutet auch der Pfeil in der Klassenübersicht an.

Klasse Entwurf2
public class Entwurf2
{
private SGLeinwand meineLeinwand;
private SGRechteck boden;
private Haus meinHaus, deinHaus,
einHaus, nochEinHaus;
public Entwurf2()
{
meineLeinwand = new SGLeinwand(800,500);
meineLeinwand.setzeHintergrundfarbe(0, 0.8, 1.0);
boden = new SGRechteck(0,400,800,200);
boden.setzeFuellung(true);
boden.setzeFarbe(0.4,1,0.4);
boden.setzeEbene(0);
meinHaus = new Haus(20,340);
deinHaus = new Haus(90,350);
einHaus = new Haus(150,340);
nochEinHaus = new Haus(230,350);
}
}
Klasse Haus
public class Haus
{
private SGRechteck haus, schornstein,
fenster, tuer;
private SGDreieck dach;
public Haus(int pX, int pY)
{
haus = new SGRechteck(pX,pY+40,60,60);
haus.setzeFuellung(true);
haus.setzeFarbe(1,0,0);
dach = new SGDreieck(pX-5,pY+40,pX+65,
pY+40,pX+30,pY);
dach.setzeFuellung(true);
dach.setzeFarbe(0,0,0);
schornstein =
new SGRechteck(pX+10,pY+5,10,20);
schornstein.setzeFuellung(true);
schornstein.setzeFarbe(1,0,0);
fenster = new SGRechteck(pX+10,pY+50,20,20);
fenster.setzeFuellung(true);
fenster.setzeFarbe(0.6,0.6,1);
fenster.setzeEbene(2);
tuer = new SGRechteck(pX+33,pY+55,20,45);
tuer.setzeFuellung(true);
tuer.setzeFarbe(0.8,0.6,0.5);
tuer.setzeEbene(2);
}
}
Aufgaben
- Im Quelltext der Klasse
Haus
sind die Zeilen 7, 9, 12/13, 17, 20 und 24 markiert. Erläutere die Bedeutung der VariablenpX
undpY
, die in diesen Anweisungen verwendet werden. - Im Quelltext der Klasse
Entwurf2
sind die Zeilen 5/6 und 16-19 hervorgehoben.- Kommentiere die Anweisungen in diesen Zeilen.
- Erläutere die Bedeutung der Werte, die in den Klammern in den Zeilen 16-19 angegeben werden.
- Gib die Koordinaten des
erdgeschosses
und dertuer
für das ObjektmeinHaus
an.
- Vergleiche die beiden Möglichkeiten zum Erstellen mehrerer Häuser. Nenne dazu Vor- und Nachteile der beiden Möglichkeiten.
- Implementiere eine zusätzliche Klasse
Baum
und erstelle in der KlasseEntwurf2
vier Bäume. - Im nebenstehenden Bild wurde die Klasse
Baum
so modifiziert, dass die Bäume eine zufällig generierte Farbe erhalten. Verändere die Klasse Baum entsprechend. - Ergänze eine Klasse
Wolke
wie im nebenstehenden Bild. - Verändere den Baum so, dass man beim Aufruf des Konstruktors neben der Position des Baums ebenfalls angeben kann, wie viele Äpfel sich an dem Baum befinden.

