/* * Engine Alpha ist eine anfängerorientierte 2D-Gaming Engine. * * Copyright (c) 2011 - 2014 Michael Andonie and contributors. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package ea.edu.mine; import ea.*; import ea.internal.util.Logger; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /** * Diese Klasse beschreibt ein Minenfeld fuer das EDU-Spiel nach "Minesweeper". * * @author Andonie * @since 2.1 */ public abstract class FieldE { /** * Der Inhalt-Text dieses Feldes */ private Text text; /** * Das aessere Rechteck. */ private Rechteck aussen; /** * Das innere Rechteck */ private Rechteck innen; /** * Die Figur im inneren */ private Figur fig; /** * Aim des ONCLICK */ private Object aim; /** * Die ONCLICK-Methode */ private Method linksclick; /** * Die rechte ONCLICK-Methode */ private Method rechtsclick; /** * Konstruktor eines Feldes fuer das "Minesweeper"-Spiel * * @param x * Die X-Koordinate (Ecke links oben) * @param y * Die Y-Koordinate (Ecke links oben) * @param laenge * Die Seitenlaenge des Feldes */ public FieldE (final int x, final int y, final int laenge) { if (laenge < 10) { Logger.error("ACHTUNG! Die Laenge dieses Feldes ist laecherlich klein (" + laenge + " Pixel)."); Logger.error("Ein groesseres stellt die Funktionsfaehigkeit sicher."); } Spiegel s = Spiegel.getSpiegel(); aussen = new Rechteck(x, y, laenge, laenge); aussen.farbeSetzen(new Farbe(30, 30, 30)); innen = new Rechteck(x + 2, y + 2, laenge - 4, laenge - 4); innen.farbeSetzen(new Farbe(60, 60, 60)); text = new Text("", x + 3, y + 3); s.wurzel.add(aussen, innen, text); aim = this; Method[] meth = aim.getClass().getMethods(); for (int i = 0; i < meth.length; i++) { if (meth[i].getName().equals("linksKlick")) { linksclick = meth[i]; } else if (meth[i].getName().equals("rechtsKlick")) { rechtsclick = meth[i]; } } s.maus().mausReagierbarAnmelden(new MausReagierbar() { @Override public void mausReagieren (int code) { klick(); } }, aussen); s.maus().rechtsKlickReagierbarAnmelden(new RechtsKlickReagierbar() { public void rechtsKlickReagieren (Punkt p) { int x = p.x(), y = p.y(); if (aussen.dimension().istIn(new Punkt(x, y))) { try { rechtsclick.invoke(aim, new Object[] {}); } catch (IllegalAccessException ex) { Logger.error("Achtung! Der Zugriff auf die Methode fuer On-Klicks hat nicht funktioniert. BUG!"); } catch (InvocationTargetException ex) { Logger.error("Achtung! Das Objekt, an dem die Methode aufzurufen war, besass selbige nicht. BUG!"); } } } }); } /** * Diese Methode wird automatisch bei jedem Klick auf das aussere Rechteck aufgerufen. */ private void klick () { try { linksclick.invoke(aim, new Object[] {}); } catch (IllegalAccessException ex) { Logger.error("Achtung! Der Zugriff auf die Methode fuer On-Klicks hat nicht funktioniert. BUG!"); } catch (InvocationTargetException ex) { Logger.error("Achtung! Das Objekt, an dem die Methode aufzurufen war, besass selbige nicht. BUG!"); } } /** * Setzt die Farbe des inneren Rechtecks. * * @param farbe * Die neue Fuellfarbe des inneren Rechtecks als <code>String</code>. */ public void fuellFarbeSetzen (String farbe) { innen.farbeSetzen(farbe); } /** * Setzt die Randfarbe neu. * * @param farbe * Die Neue Fuellfarbe des ausseren (Rand-)Rechtecks als <code>String</code>. */ public void randFarbeSetzen (String farbe) { aussen.farbeSetzen(farbe); } /** * Setzt die Fuellfarbe des Textes neu. * * @param farbe * Die neue Fuellfarbe des Textes als <code>String</code>. */ public void textFarbeSetzen (String farbe) { text.farbeSetzen(farbe); } /** * Setzt einen neuen Inhalt fuer den Text dieses * * @param inhalt * Der neue Inhalt für den Text */ public void textSetzen (String inhalt) { text.sichtbarSetzen(false); text.inhaltSetzen(inhalt); text.groesseSetzen(40); while (!innen.dimension().umschliesst(text.dimension()) && text.groesse() > 10) { text.groesseSetzen(text.groesse() - 1); } text.mittelpunktSetzen(aussen.mittelPunkt()); text.sichtbarSetzen(true); } /** * Bringt eine Figur - basierend auf einer Figurdatei - in die Mitte dieses Fekdes ein. Mit * <code>figurEntfernen()</code> kann die Figur entfernt werden und durch erneuten Aufruf dieser * Methode das Bild auch gewechselt werden. * * @param datei * Der Name der Datei, die die darzustellende Figur beinhaltet. Diese Datei sollte sich im * Projektordner des BlueJ-Projektes befinden! * * @see #figurEntfernen() */ public void figurEinsetzen (String datei) { if (!datei.endsWith(".eaf")) { Logger.error("Achtung! Der eingegebene Dateiname endet nicht mit .eaf!"); return; } if (fig != null) { Spiegel.getSpiegel().wurzel.entfernen(fig); } fig = new Figur(0, 0, datei); fig.faktorSetzen(1); do { fig.faktorSetzen(fig.animation()[0].faktor() + 1); fig.mittelpunktSetzen(aussen.mittelPunkt()); } while (aussen.dimension().umschliesst(fig.dimension())); fig.faktorSetzen(fig.animation()[0].faktor() - 1); fig.mittelpunktSetzen(aussen.mittelPunkt()); Spiegel.getSpiegel().wurzel.add(fig); } /** * Entfernt die Figur von dem Feld - sofern eine vorhanden war. * * @see #figurEinsetzen(java.lang.String) */ public void figurEntfernen () { if (fig == null) { return; } Spiegel.getSpiegel().wurzel.entfernen(fig); fig = null; } }