import java.awt.geom.Ellipse2D;
/**
* Ein Kreis, der manipuliert werden kann und sich selbst auf einer
* Leinwand zeichnet.
*
* @author Michael Kölling und David J. Barnes
* @version 1.0 (7. Februar 2003)
*/
public class Kreis
{
private int durchmesser;
private int xPosition;
private int yPosition;
private String farbe;
private boolean istSichtbar;
/**
* Erzeuge einen neuen Kreis an einer Standardposition mit
* einer Standardfarbe.
*/
public Kreis()
{
durchmesser = 30;
xPosition = 20;
yPosition = 60;
farbe = "rot";
istSichtbar = true;
}
/**
* Kreis durch Eingabe des x und y Wertes positionieren
*/
public void positionieren(int xWert,int yWert)
{
loeschen();
xPosition = xWert;
yPosition = yWert;
zeichnen();
}
/**
* Mache diesen Kreis sichtbar. Wenn es bereits sichtbar ist, tue
* nichts.
*/
public void sichtbarMachen()
{
istSichtbar = true;
zeichnen();
}
/**
* Mache diesen Kreis unsichtbar. Wenn es bereits unsichtbar ist, tue
* nichts.
*/
public void unsichtbarMachen()
{
loeschen();
istSichtbar = true;
}
/**
* Bewege diesen Kreis einige Bildschirmpunkte nach rechts.
*/
public void nachRechtsBewegen()
{
horizontalBewegen(20);
}
/**
* Bewege diesen Kreis einige Bildschirmpunkte nach links.
*/
public void nachLinksBewegen()
{
horizontalBewegen(-20);
}
/**
* Bewege diesen Kreis einige Bildschirmpunkte nach oben.
*/
public void nachObenBewegen()
{
vertikalBewegen(-20);
}
/**
* Bewege diesen Kreis einige Bildschirmpunkte nach unten.
*/
public void nachUntenBewegen()
{
vertikalBewegen(20);
}
/**
* Bewege diesen Kreis horizontal um 'entfernung' Bildschirmpunkte.
*/
public void horizontalBewegen(int entfernung)
{
loeschen();
xPosition += entfernung;
zeichnen();
}
/**
* Bewege diesen Kreis vertikal um 'entfernung' Bildschirmpunkte.
*/
public void vertikalBewegen(int entfernung)
{
loeschen();
yPosition += entfernung;
zeichnen();
}
/**
* Bewege diesen Kreis langsam horizontal um 'entfernung'
* Bildschirmpunkte.
*/
public void langsamHorizontalBewegen(int entfernung)
{
int delta;
if (entfernung < 0)
{
delta = -1;
entfernung = -entfernung;
}
else
{
delta = 1;
}
for (int i = 0; i < entfernung; i++)
{
xPosition += delta;
zeichnen();
}
}
/**
* Bewege diesen Kreis langsam vertikal um 'entfernung'
* Bildschirmpunkte.
*/
public void langsamVertikalBewegen(int entfernung)
{
int delta;
if (entfernung < 0)
{
delta = -1;
entfernung = -entfernung;
}
else
{
delta = 1;
}
for (int i = 0; i < entfernung; i++)
{
yPosition += delta;
zeichnen();
}
}
/**
* Ändere den Durchmesser dieses Kreises in 'neuerDurchmesser'
* (Angabe in Bildschirmpunkten).
* 'neuerDurchmesser' muss größer gleich Null sein.
*/
public void groesseAendern(int neuerDurchmesser)
{
loeschen();
durchmesser = neuerDurchmesser;
zeichnen();
}
/**
* Ändere die Farbe dieses Kreises in 'neueFarbe'.
* Gültige Angaben sind "rot", "gelb", "blau", "gruen",
* "lila" und "schwarz".
*/
public void farbeLampeAendern(String neueFarbe)
{
farbe = neueFarbe;
zeichnen();
}
/*
* Zeichne diesen Kreis mit seinen aktuellen Werten auf den Bildschirm.
*/
private void zeichnen()
{
if (istSichtbar)
{
Leinwand leinwand = Leinwand.gibLeinwand();
leinwand.zeichne(
this,
farbe,
new Ellipse2D.Double(xPosition, yPosition, durchmesser, durchmesser));
leinwand.warte(10);
}
}
/*
* Lösche diesen Kreis vom Bildschirm.
*/
private void loeschen()
{
if (istSichtbar)
{
Leinwand leinwand = Leinwand.gibLeinwand();
leinwand.entferne(this);
}
}
}
/**
* Write a description of class Lampe here.
*
* @author (feni)
* @version (11/12/08)
*/
public class Lampe
{
private Quadrat halterung;
private Kreis licht;
private boolean lampeAn;
/**
* Constructor for objects of class Lampe
*/
public Lampe(String farbeLampe)
{
halterung = new Quadrat();
halterung.groesseAendern(60);
halterung.positionieren(60,90);
halterung.farbeAendern("schwarz");
halterung.sichtbarMachen();
licht = new Kreis();
licht.groesseAendern(50);
licht.positionieren(65,95);
licht.farbeLampeAendern(farbeLampe);
licht.sichtbarMachen();
lampeAn = true; //Zustand der Lampe
}
/**
* Lampe durch Eingabe der x und y Werte positionieren
*/
public void lampePositionieren(int xPosi,int yPosi)
{
halterung.positionieren(xPosi,yPosi);
licht.positionieren(xPosi+5,yPosi+5);
}
/**
* Lampe einschalten, falls eingeschaltet tue nichts
*/
public void einschalten()
{
licht.sichtbarMachen();
lampeAn = true;
}
/**
* Lampe ausschalten, falls ausgeschaltet tue nichts
*/
public void ausschalten()
{
licht.unsichtbarMachen();
lampeAn = false;
}
public String gibLampeAn() //Ausgabe des Lampenstatus
{
return lampeAn; //!!?!
}
}
/**
* Write a description of class Ampel here.
*
* @author (feni)
* @version (12/12/08)
*/
public class Ampel
{
private Lampe licht1;
private Lampe licht2;
private Lampe licht3;
/**
* Constructor for objects of class Ampel
*/
public Ampel()
{
licht1 = new Lampe("rot");
licht1.lampePositionieren(90,60);
licht2 = new Lampe("gelb");
licht2.lampePositionieren(90,120);
licht3 = new Lampe("gruen");
licht3.lampePositionieren(90,180);
}
/**
* Ampel rot leuchten lassen, falls sie schon rot leuchtet, tue nichts
*/
public int Fall; // "Fall" zur Fallentscheidung beim Umschalten
public void rot()
{
licht1.einschalten();
licht2.ausschalten();
licht3.ausschalten();
Fall = 100;
}
/**
* Ampel rotgelb leuchten lassen, falls sie schon rotgelb leuchtet, tue nichts
*/
public void rotgelb()
{
licht1.einschalten();
licht2.einschalten();
licht3.ausschalten();
Fall = 101;
}
/**
* Ampel gelb leuchten lassen, falls sie schon gelb leuchtet, tue nichts
*/
public void gelb()
{
licht1.ausschalten();
licht2.einschalten();
licht3.ausschalten();
Fall = 102;
}
/**
* Ampel gruen leuchten lassen, falls sie schon gruen leuchtet, tue nichts
*/
public void gruen()
{
licht1.ausschalten();
licht2.ausschalten();
licht3.einschalten();
Fall = 103;
}
/**
* Die gesammte Ampel durch Eingabe von x und y Wert positionieren
*/
public void ampelPositionieren(int xWert,int yWert)
{
licht1.lampePositionieren(xWert,yWert);
licht2.lampePositionieren(xWert,yWert+60);
licht3.lampePositionieren(xWert,yWert+120);
}
/**
* in den nächsten zustand umschalten
* rot-->rotgelb-->gruen-->gelb-->rot...
*/
public void umschalten()
{
switch (Fall){
case 100 : licht1.einschalten();
licht2.einschalten();
licht3.ausschalten();
Fall = 101;
break;
case 101 : licht1.ausschalten();
licht2.ausschalten();
licht3.einschalten();
Fall = 103;
break;
case 103 : licht1.ausschalten();
licht2.einschalten();
licht3.ausschalten();
Fall = 102;
break;
case 102 : licht1.einschalten();
licht2.ausschalten();
licht3.ausschalten();
Fall = 100;
}
}
}