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
Haussind die Zeilen 7, 9, 12/13, 17, 20 und 24 markiert. Erläutere die Bedeutung der VariablenpXundpY, die in diesen Anweisungen verwendet werden. - Im Quelltext der Klasse
Entwurf2sind 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
erdgeschossesund dertuerfür das ObjektmeinHausan.
- Vergleiche die beiden Möglichkeiten zum Erstellen mehrerer Häuser. Nenne dazu Vor- und Nachteile der beiden Möglichkeiten.
- Implementiere eine zusätzliche Klasse
Baumund erstelle in der KlasseEntwurf2vier Bäume. - Im nebenstehenden Bild wurde die Klasse
Baumso modifiziert, dass die Bäume eine zufällig generierte Farbe erhalten. Verändere die Klasse Baum entsprechend. - Ergänze eine Klasse
Wolkewie 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.