import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.util.ArrayList;
import javax.swing.JFrame;
/**
*
*
Diese Klasse stellt Raphael ein einfaches Spielfeld zur Verfügung.</p>
*
*
Dazu wird ein JFrame mit leerem weißen Hintergrund erzeugt.</p>
*
Mit der "setzeSpielfigur()" Methode kann eine Spielfigur auf das
* Spielfeld gesetzt werden. Die Spielfigur wird durch ein kleines Quadrat
* dargestellt und der Name der Spielfigur wird über der Figur angezeigt.</p>
*
*
Mit der Methode "bewegeSpielfigur()" kann eine bereits gesetzte Spielfigur
* an eine andere Stelle bewegt werden. Dazu wird die "alte" Darstellung der
* Figur gelöscht und an den neu übergebenen Koordinaten neu gesetzt.</p>
*
* @author Jens Post
* @version 11 (30.10.2008)
*
*/
public class Spielfeld extends JFrame{
private static final long serialVersionUID = 1L;
private ArrayList spielFigurenListe = new ArrayList();
private String nameUpdate;
private Integer xKoordinate = new Integer(0);
private Integer yKoordinate = new Integer(0);
private Integer xKoordinateNeu = new Integer(0);
private Integer yKoordinateNeu = new Integer(0);
private String currentName;
/**
*
Diese Methode muß aufgerufen werden, um das Spielfeld auf dem
* Bildschirm sichtbar zu machen. Nach dem Aufruf dieser Methode ist
* das Spielfeld leer und hat einen weißen Hintergrund.</p>
*/
public void macheSpielfeldSichtbar(){
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Spielfeld");
this.setSize(800,600);
this.setBackground(Color.white);
this.setVisible(true);
// Spielfeld leeren
Graphics spielfeldGraphics = this.getGraphics();
spielfeldGraphics.clearRect(this.getInsets().left,
this.getInsets().top,
this.getWidth() - this.getInsets().left - this.getInsets().right,
this.getHeight() - this.getInsets().top - this.getInsets().bottom);
}
/**
*
Setzen einer NEUEN Spielfigur auf dem Spielfeld.</p>
* @param name Der Name der Spielfigur. Wird auf dem Spielfeld über dem Spielfigursymbol angezeigt.
* @param gegebenexKoordinate Die X-Koordinate, auf die die Figur auf dem Spielfeld gesetzt werden soll.
* @param gegebeneyKoordinate Die Y-Koordinate, auf die die Figur auf dem Spielfeld gesetzt werden soll.
*/
public void setzeSpielfigur(String name, int gegebenexKoordinate, int gegebeneyKoordinate){
xKoordinate = new Integer (gegebenexKoordinate);
yKoordinate = new Integer (gegebeneyKoordinate);
spielFigurenListe.add(name);
spielFigurenListe.add(xKoordinate);
spielFigurenListe.add(yKoordinate);
Graphics spielfeldGraphics = this.getGraphics();
this.update(spielfeldGraphics);
}
/**
*
Bewegen einer bereits gesetzten Spielfigur. Beim Bewegen einer Spielfigur wird die
* Spielfigur von ihrem alten Platz gelöscht und an den neu gegebenen Koordinaten wieder
* angezeigt.</p>
*
Der Parameter "name" legt dabei fest, welche der existierenden Figuren bewegt wird.
* Wenn ein unbekannter Name gegeben wird, werden die bekannten Spielfiguren an ihrer
* aktuellen Position neu gezeichnet, sonst passiert nichts. Der Benutzer bemerkt also
* keine Aktion.</p>
* @param name Der Name der Spielfigur, die bewegt werden soll.
* @param gegebenexKoordinate Die X-Koordinate, auf die die Figur auf dem Spielfeld bewegt werden soll.
* @param gegebeneyKoordinate Die X-Koordinate, auf die die Figur auf dem Spielfeld bewegt werden soll.
*/
public void bewegeSpielfigur(String name, int gegebenexKoordinate, int gegebeneyKoordinate){
nameUpdate = name;
xKoordinateNeu = new Integer (gegebenexKoordinate);
yKoordinateNeu = new Integer (gegebeneyKoordinate);
Graphics spielfeldGraphics = this.getGraphics();
this.update(spielfeldGraphics);
}
/**
*
Diese Methode dient klasseninternen Zwecken. Sie überschreibt die paint Mathode und
* definiert, was auf dem Spielfeld gezeichnet werden soll.</p>
*
Sie sollte keinesfalls von Benutzern dieser Klasse aufgerufen werden.</p>
*/
public void paint(Graphics spielfeldGraphics){
int anzahlSpielfigurenEintraege = spielFigurenListe.size();
for (int i = 0; i < anzahlSpielfigurenEintraege; i = i+3){
currentName = (String)spielFigurenListe.get(i);
xKoordinate = (Integer)spielFigurenListe.get(i+1);
yKoordinate = (Integer)spielFigurenListe.get(i+2);
if (currentName.equals(nameUpdate)){
spielfeldGraphics.clearRect(xKoordinate.intValue(), yKoordinate.intValue(), 10, 10);
FontMetrics fontMetrics = spielfeldGraphics.getFontMetrics();
int namensLaenge = fontMetrics.stringWidth(currentName);
int unterLaenge = fontMetrics.getDescent();
int ueberLaenge = fontMetrics.getAscent();
spielfeldGraphics.clearRect(xKoordinate.intValue(), yKoordinate.intValue() - ueberLaenge, namensLaenge, unterLaenge + ueberLaenge);
xKoordinate = xKoordinateNeu;
yKoordinate = yKoordinateNeu;
spielFigurenListe.set(i+1, xKoordinate);
spielFigurenListe.set(i+2, yKoordinate);
}
spielfeldGraphics.fillRect(xKoordinate.intValue(), yKoordinate.intValue(), 10, 10);
spielfeldGraphics.drawString(currentName, xKoordinate.intValue(), yKoordinate.intValue());
}
}
}