/* * 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; /** * Diese Interne Klasse ermoeglicht folgendes:<br /> Das sich aus der Hauptklasse ableitende Spiel * ist minimal umfangreich. Die volle Funktionsfaehigkeit der Klasse <code>Game</code> wird hier * nach aussen nicht zugaenglich gemacht. Aus folgenden Gruenden:<br /> - Der volle Funktionsumfang * soll in der echten Engine bleiben, damit ausreichender Reiz besteht, nicht innerhalb der * beschraenkten EDU-Version zu bleiben.<br /> - Weniger Verwirrung in der Analyse der moeglichen * Methode. * * @see ea.edu.mine.Spiegel */ public class Spiegel extends Game implements KlickReagierbar, RechtsKlickReagierbar { /** * Die aktuellste Spiegelinstanz */ private static Spiegel instanz = null; /** * Das MINE-Game */ private final MineGameE mine; /** * Die aktive Maus des Spiels. */ private final Maus maus; /** * Konstruktor eines Spiegels. * * @param mine * Das MINE-Game * @param breiteF * Fensterbreite * @param hoeheF * Fensterhoehe * @param titelF * Fenstertitel */ public Spiegel (MineGameE mine, int breiteF, int hoeheF, String titelF) { super(breiteF, hoeheF, titelF); this.mine = mine; maus = new Maus(3, false, false); mausAnmelden(maus); maus.klickReagierbarAnmelden(this); maus.rechtsKlickReagierbarAnmelden(this); } /** * Die Methode, um auf den aktiven Spiegel allgemein zugreifen zu koennen. * * @return Die aktive Spiegel-Instanz. */ public static final Spiegel getSpiegel () { if (instanz == null) { instanz = new ErrorSpiegel(); return instanz; } return instanz; } /** * Singelton-aehnliche Methode zum erhalten des korrekten Spiegels. Garantiert, das nur eine * Instanz eine <code>Game</code>-Objekt im Minesweeper-Projekt vorliegt. * * @param mine * Das MINE-Game * @param breiteF * Fensterbreite * @param hoeheF * Fensterhoehe * @param titelF * Fenstertitel * * @return Der aktive Spiegel bzw. ein neuer, jetzt aktiver Spiegel gemaess den Parametern. */ public static final Spiegel getSpiegel (MineGameE mine, int breiteF, int hoeheF, String titelF) { if (instanz == null) { return instanz = new Spiegel(mine, breiteF, hoeheF, titelF); } Logger.error("Achtung! Es existiert schon ein Spiel! Ein zweites kann nicht erstellt werden."); return instanz; } /** * Diese Methode gibt die aktive Maus aus. * * @return Eine Referenz auf die aktive Maus des Spielfensters dieses Spiegels. */ public Maus maus () { return maus; } /** * Die Methode zum "echten" Reagieren auf den Klick im Spiel.<br /> Wird jedoch direkt an die * falsche Game-Klasse <code>MineGameE</code> weitergeleitet. * * @param punkt beschreibt den Punkt des Klicks. */ @Override public void klickReagieren (Punkt punkt) { mine.klick(punkt.x(), punkt.y()); } /** * Tasten-Reaktionsmethode. * * @param code * Der Tastencode. * * @see ea.Game#tasteReagieren(int) */ @Override public void tasteReagieren (int code) { mine.taste(code); } /** * Rechtsklick-Reaktionsmethode * * @param punkt Beschreibt den Punkt des Klicks. */ @Override public void rechtsKlickReagieren (Punkt punkt) { mine.klickR(punkt.x(), punkt.y()); } } /** * Ein Errorspiegel ist ein Fenster mit klarer Fehlermeldung.<br /> Es signalisiert dem * Programmierer, dass ein Feld erstellt wurde, bevor ein Fenster erstellt wurde. */ class ErrorSpiegel extends Spiegel { /** * Erstellt einen Error-Spiegel */ public ErrorSpiegel () { super(new MineGameE() { }, 500, 500, "FEHLER!!!"); Rechteck r = super.fensterGroesse().ausDiesem(); r.farbeSetzen("Rot"); Text t = new Text("FEHLER! Erst muss eine eigene", 10, 230); Text t2 = new Text("Spielklasse erstellt werden!", 10, 260); t.schriftartSetzen(1); t2.schriftartSetzen(1); wurzel.add(r, t, t2); nachrichtSchicken("Achtung! Als erstes muss ein Spiel erstellt werden, dann koennen Spielelemente korrekt instanziiert werden!"); } }