Hallo,
ich habe hier ein paar Klassen, die zusammen die Grundlage eines kleinen Spieles bilden sollen (die Aufteilung in die vielen Klassen ergab sich aus Übungsgründen).
Folgendes soll eigentlich passieren:
Es erscheint ein Karten-Raster (Rastergröße wird momentan noch per Parameter aus dem HTML übergeben. Bei einem Klick auf eine Karte werden die umliegenden Karten gedreht (Farbe geändert). Ziel ist es, alle Karten umzudrehen.
Stand:
Alle Klassen lassen sich fehlerfrei kompilieren.
Der Aufruf der HTML-Seite startet das Applet, das Raster erscheint.
Das Problem:
Das Applet reagiert NICHT auf Mausklicks. Statt dessen hängt sich der Browser auf.
Starte ich das ganze im Appletviewer, passiert auch nicht mehr. Mein Problem ist, es erscheinen keine Fehler...
Ich hocke jetzt schon Stunden davor und sehe inzwischen den Wald vor lauter Bäumen nicht mehr. :bahnhof:
Möglicherweise habe ich irgendwas übersehen oder vergessen?
Könnt ihr mir vielleicht weiterhelfen?
So, jetzt noch ein bischen html, mit den Parametern:
Gruß und Dank
Thomas
ich habe hier ein paar Klassen, die zusammen die Grundlage eines kleinen Spieles bilden sollen (die Aufteilung in die vielen Klassen ergab sich aus Übungsgründen).
Folgendes soll eigentlich passieren:
Es erscheint ein Karten-Raster (Rastergröße wird momentan noch per Parameter aus dem HTML übergeben. Bei einem Klick auf eine Karte werden die umliegenden Karten gedreht (Farbe geändert). Ziel ist es, alle Karten umzudrehen.
Stand:
Alle Klassen lassen sich fehlerfrei kompilieren.
Der Aufruf der HTML-Seite startet das Applet, das Raster erscheint.
Das Problem:
Das Applet reagiert NICHT auf Mausklicks. Statt dessen hängt sich der Browser auf.
Starte ich das ganze im Appletviewer, passiert auch nicht mehr. Mein Problem ist, es erscheinen keine Fehler...
Ich hocke jetzt schon Stunden davor und sehe inzwischen den Wald vor lauter Bäumen nicht mehr. :bahnhof:
Möglicherweise habe ich irgendwas übersehen oder vergessen?
Könnt ihr mir vielleicht weiterhelfen?
Code:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Panel;
public class FarbMosaik extends Panel {
protected ModelIF model;
protected MosaikEventHandler eventHandler;
public FarbMosaik(int raster, int breite, Color farbeRueck, Color farbeVor) {
model = new MosaikModel(raster, raster);
eventHandler = new MosaikEventHandler (model);
setLayout(new GridLayout(raster, raster, 1, 1));
int canvasBreite = breite/raster;
for (int i=0; i< raster; i++) {
for (int j=0; j< raster; j++) {
MosaikCanvas mc = new MosaikCanvas (i, j, farbeRueck, farbeVor);
mc.addMouseListener(eventHandler);
model.putMObj(i, j, mc);
mc.setSize(canvasBreite, canvasBreite);
add(mc);
}
}
}
}
Code:
public interface ModelIF {
public void action(int zeile, int spalte);
public void putMObj(int zeile, int spalte, MosaikIF mObj);
public MosaikIF getMObj(int zeile, int spalte);
}
Code:
import java.awt.Color;
import java.applet.Applet;
public class Mosaik extends Applet {
private Color farbeRueck, farbeVor;
int raster; //Rastermass der Spielfläche
public void init() {
resize(250, 250);
//Spielparameter
String temp = getParameter("raster");
raster = Integer.parseInt(temp);
farbeRueck = new Color(230, 30, 50);
farbeVor = new Color(50, 210, 30);
//Spielflaeche
FarbMosaik fm = new FarbMosaik(raster, getSize().width, farbeRueck, farbeVor);
add(fm);
}
}
Code:
import java.awt.*;
/**
* Diese Komponente bildet eine Spielkarte mit unterschiedlich gefärbter Vorder- und Rückseite ab.
* Aus mehreren Objekten dieser Komponete kannein Mosaikspiel zusammengesetzt werdem.
* Dabei wird ein Umdrehen einer Karte durch einen Farbwechsel simuliert.
*/
public class MosaikCanvas extends Canvas implements MosaikIF {
//Farbe
private Color farbe, farbeRueck, farbeVor;
public Color getFarbe() {
return farbe;
}
public void setFarbe(Color inValue) {
farbe = inValue;
}
//Seite
private boolean seite;
public boolean getSeite() {
return seite;
}
public void setSeite(boolean inValue) {
seite = inValue;
}
//Zeile und Spalte
private int zeile, spalte;
public int getZeile() {
return zeile;
}
public void setZeile(int inValue) {
zeile = inValue;
}
public int getSpalte() {
return spalte;
}
public void setSpalte(int inValue) {
spalte = inValue;
}
/**
* Initialisiert ein Objekt unter Angabe der Lage in einem Containerraster mit
* festgelegten Vorder- und Rückseitenfarben.
* Der eingebettete Container sollte ein GridLayout verwenden.
* @param zeile Nummer der [i]Zeile[/i] im eingebetteten Container
* @param spalte Nummer der [i]Spalte[/i] im eingebetteten Container
* @param farbeRueck Color-Objekt zur Einfärbung der [i]Rueckseite[/i] der Komponente
* @param farbeVor Color-Objekt zur Einfärbung der [i]Vorderseite[/i] der Komponente
*/
public MosaikCanvas(int zeile, int spalte, Color farbeRueck, Color farbeVor) {
this.zeile = zeile;
this.spalte = spalte;
this.farbeRueck = farbeRueck;
this.farbeVor = farbeVor;
//setze Default-Werte:
setSeite(false);
setFarbe(farbeRueck);
}
/**
* Wechselt die Einfärbung der Komponente, so das ein Umdrehen der Karte simuliert wird. Gewechselt
* wird zwischen zwei Farben, die im Konstruktor zu setzen sind.
* @see #MosaikCanvas(int, int, Color, Color)
*/
public void switchSeite() {
seite =! seite;
farbe = (farbe == farbeRueck) ? farbeVor : farbeRueck;
repaint();
}
public void paint(Graphics g) {
g.setColor(getFarbe());
g.fillRect(0, 0, getSize().width, getSize().height);
}
}
Code:
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Hashtable;
import java.util.Enumeration;
public class MosaikEventHandler implements MouseListener {
private int zeile, spalte;
ModelIF model;
Hashtable modelTable;
Object key;
public MosaikEventHandler(ModelIF model) {
modelTable=new Hashtable();
key=new Integer(model.hashCode());
modelTable.put(key,model);
addModel(model);
}
public void addModel(ModelIF model) {
key=new Integer(model.hashCode());
modelTable.put(key, model);
}
public MosaikIF removeModel(ModelIF model) {
key=new Integer(model.hashCode());
return (MosaikIF)modelTable.remove(key);
}
//die MouseListener-Methoden:
public void mouseClicked(MouseEvent me) {}
public void mouseEntered(MouseEvent me) {}
public void mouseExited(MouseEvent me) {}
public void mousePressed(MouseEvent me) {}
/**
* Implementierung der MouseListener zwecks Wechsel der Seite einer eingebetteten MosaikCanvas-Komponente.
* Das Eventauslösende MasaikCanvas-Objekt wird ermittelt und dessen switchSeite-Methode aufgerufen.
* <code>((MosaikCanvas)me.getSource()).switchSeite();</code>
* @see MosaikCanvas#switchSeite()
*/
public void mouseReleased(MouseEvent me) {
zeile=((MosaikIF)me.getSource()).getZeile();
spalte=((MosaikIF)me.getSource()).getSpalte();
Enumeration enum=modelTable.keys();
while (enum.hasMoreElements())
((ModelIF)modelTable.get(key)).action(zeile,spalte);
}
}
Code:
public interface MosaikIF {
public boolean getSeite();
public void switchSeite();
public int getZeile();
public int getSpalte();
}
Code:
public class MosaikModel implements ModelIF {
MosaikIF [][] mObjects;
int zeilen, spalten;
public MosaikModel(int zeilen, int spalten) {
this.zeilen = zeilen;
this.spalten = spalten;
mObjects = new MosaikIF[zeilen][spalten];
}
/**
* Prüft die angrenzenden Felder auf Zugehörigkeit zur Spielfläche.
* Wenn die Felder sich innerhalb der Spielfläche befinden, werden sie umgedreht.
* @param zeile Nummer der [i]Zeile[/i] im eingebetteten Container
* @param spalte Nummer der [i]Spalte[/i] im eingebetteten Container
*/
public void switchNachbarn(int zeile, int spalte) {
//erste Zeile prüfen/drehen
if (zeile-1 >=0) {
invert(zeile-1, spalte);
if (spalte-1 >=0)
invert(zeile-1, spalte-1);
if (spalte+1 < spalten)
invert(zeile-1, zeile+1);
}
//zweite Zeile prüfen/drehen
if (spalte-1 >=0)
invert(zeile, spalte-1);
if (spalte+1 < spalten)
invert(zeile, spalte+1);
//dritte Zeile prüfen/drehen
if (zeile+1 < zeilen) {
invert(zeile+1, spalte);
if (zeile-1 >=0)
invert(zeile+1, spalte-1);
if (spalte+1 < spalten)
invert(zeile+1, spalte+1);
}
}
public void invert(int zeile, int spalte) {
getMObj(zeile, spalte).switchSeite();
}
public void action(int zeile, int spalte) {
switchNachbarn(zeile, spalte);
}
public void putMObj(int zeile, int spalte, MosaikIF mObj) {
mObjects [zeile][spalte] = mObj;
}
public MosaikIF getMObj(int zeile, int spalte) {
return mObjects [zeile][spalte];
}
}
So, jetzt noch ein bischen html, mit den Parametern:
Code:
<html>
<head><title>Mosaik - Play the Game</title></head>
<body>
<applet code="Mosaik.class" width="500" height="500">
<param name="raster" value="4">
</applet>
</body>
</html>
Gruß und Dank
Thomas