Package schule.ngb.zm

Class Zeichenmaschine

java.lang.Object
schule.ngb.zm.Constants
schule.ngb.zm.Zeichenmaschine
Direct Known Subclasses:
Spielemaschine

public class Zeichenmaschine extends Constants
Hauptklasse der Zeichenmaschine.

Projekte der Zeichenmaschine sollten als Unterklasse implementiert werden. Die Klasse übernimmt die Initialisierung eines Programmfensters und der nötigen Komponenten.

  • Field Details

    • IN_BLUEJ

      public static final boolean IN_BLUEJ
      Gibt an, ob die Zeichenmaschine aus BlueJ heraus gestartet wurde.
    • canvas

      protected Zeichenleinwand canvas
      Die Leinwand, auf die alles gezeichnet wird. Die Leinwand enthält Ebenen, die einzelne Zeichnungen enthalten. Die Inhalte aller Ebenen werden einmal pro Frame auf die Hauptleinwand übertragen.
    • background

      protected static ColorLayer background
      Ebene mit der Hintergrundfarbe.
    • drawing

      protected static DrawingLayer drawing
      Zeichenebene
    • shapes

      protected static ShapesLayer shapes
      Formenebene
    • frame

      protected Zeichenfenster frame
      Das Zeichenfenster der Zeichenmaschine
    • cursorVisible

      protected boolean cursorVisible
      Ob der Mauszeiger derzeit sichtbar ist (bzw. sein sollte).
    • globalSyncLock

      public static final Object globalSyncLock
      Globaler Monitor, der einmal pro Frame vom Zeichenthread freigegeben wird. Andere Threads können Object.wait() auf dem Monitor aufrufen, um sich mit dem Zeichenthread zu synchronisieren. Der wait() Aufruf sollte sich zur Sicherheit in einer Schleife befinden, die prüft, ob sich der Aktuelle Constants.tick erhöht hat.
      
       int lastTick = Constants.tick;
      
       // Do some work
      
       while( lastTick >= Constants.tick ) {
           synchronized( Zeichenmaschine.globalSyncLock ) {
               try {
                   Zeichenmaschine.globalSyncLock.wait();
               } catch( InterruptedException ex ) {}
           }
       }
       // Next frame has started
       

      Die FrameSynchronizedTask implementiert eine Task, die sich automatisch auf diese Wiese mit dem Zeichenthread synchronisiert.

  • Constructor Details

    • Zeichenmaschine

      public Zeichenmaschine()
      Erstellt eine neue Zeichenmaschine mit Standardwerten für Titel und Größe.

      Siehe Zeichenmaschine(int, int, String, boolean) für mehr Details.

    • Zeichenmaschine

      public Zeichenmaschine(boolean run_once)
      Erstellt eine neue Zeichenmaschine mit Standardwerten für Titel und Größe.

      Siehe Zeichenmaschine(int, int, String, boolean) für mehr Details.

      Parameters:
      run_once - true beendet die Zeichenmaschine nach einem Aufruf von draw().
    • Zeichenmaschine

      public Zeichenmaschine(String title)
      Erstellt eine neue Zeichenmaschine mit dem angegebene Titel und Standardwerten für die Größe.

      Siehe Zeichenmaschine(int, int, String, boolean) für mehr Details.

      Parameters:
      title - Der Titel, der oben im Fenster steht.
    • Zeichenmaschine

      public Zeichenmaschine(String title, boolean run_once)
      Erstellt eine neue Zeichenmaschine mit dem angegebene Titel und Standardwerten für die Größe.

      Siehe Zeichenmaschine(int, int, String, boolean) für mehr Details.

      Parameters:
      title - Der Titel, der oben im Fenster steht.
      run_once - true beendet die Zeichenmaschine nach einem Aufruf von draw().
    • Zeichenmaschine

      public Zeichenmaschine(int width, int height, String title)
      Erstellt eine neue zeichenmaschine mit einer Leinwand der angegebenen Größe und dem angegebenen Titel.

      Siehe Zeichenmaschine(int, int, String, boolean) für mehr Details.

      Parameters:
      width - Breite der Zeichenleinwand.
      height - Höhe der Zeichenleinwand.
      title - Der Titel, der oben im Fenster steht.
    • Zeichenmaschine

      public Zeichenmaschine(int width, int height, String title, boolean run_once)
      Erstellt eine neue zeichenmaschine mit einer Leinwand der angegebenen Größe und dem angegebenen Titel.

      Die Zeichenmaschine öffnet automatisch ein Fenster mit einer Zeichenleinwand, die width Pixel breit und height Pixel hoch ist. Die Leinwand hat immer eine Mindestgröße von 100x100 Pixeln und kann nicht größer als der aktuelle Bildschirm werden. Das Fenster bekommt den angegebenen Titel.

      Falls run_once gleich false ist, werden update(double) und draw() entsprechend der Constants.framesPerSecond kontinuierlich aufgerufen. Falls das Programm als Unterklasse der Zeichenmaschine verfasst wird, dann kann auch, update(double) überschrieben werden, damit die Maschine nicht automatisch beendet.

      Parameters:
      width - Breite der Zeichenleinwand.
      height - Höhe der Zeichenleinwand.
      title - Der Titel, der oben im Fenster steht.
      run_once - true beendet die Zeichenmaschine nach einem Aufruf von draw().
  • Method Details

    • centerFrame

      public final void centerFrame()
      Zentriert das Zeichenfenster auf dem aktuellen Bildschirm.
    • setFullscreen

      public final void setFullscreen(boolean pEnable)
      Aktiviert oder deaktiviert den Vollbildmodus für die Zeichenmaschine.

      Der Vollbildmodus wird abhängig von pEnable entweder aktiviert oder deaktiviert. Wird die Zeichenmaschine in den Vollbildmodus versetzt, dann wird automatisch ein KeyListener aktiviert, der bei Betätigung der ESCAPE-Taste den Vollbildmodus verlässt. Wird der Vollbildmodus verlassen, wird die zuletzt gesetzte Fenstergröße wiederhergestellt.

      Parameters:
      pEnable - Wenn true, wird der Vollbildmodus aktiviert, ansonsten deaktiviert.
    • isFullscreen

      public boolean isFullscreen()
      Prüft, ob das Zeichenfenster im Vollbild läuft.
      Returns:
      true, wenn sich das Fesnter im Vollbildmodus befindet, false sonst.
    • getState

      public Options.AppState getState()
      Gibt den aktuellen Zustand der Zeichenmaschine zurück.
      Returns:
      Der Zustand der Zeichenmaschine.
    • show

      public final void show()
      Zeigt das Zeichenfenster an.
    • hide

      public final void hide()
      Versteckt das Zeichenfenster.
    • redraw

      public final void redraw()
      Zeichnet die Zeichenleinwand neu und zeigt den aktuellen Inhalt im Zeichenfenster an.
    • render

      public final void render()
      Zeigt den aktuellen Inhalt der Zeichenleinwand im Zeichenfenster an, ohne vorher draw() aufzurufen.
    • pause

      public final void pause()
      Pausiert die Ausführung von update(double) und draw() nach dem nächsten vollständigen Frame.

      Die Zeichenmaschine wechselt in den Zustand Options.AppState.PAUSED, sobald der aktuelle Frame beendet wurde.

    • resume

      public final void resume()
      Setzt die Ausführung der Zeichenmaschine fort, nachdem diese mit pause() pausiert wurde.
    • isPaused

      public final boolean isPaused()
      Prüft, ob die Zeichenmaschine gerade pausiert ist.
      Returns:
    • isTerminated

      public final boolean isTerminated()
    • isTerminating

      public final boolean isTerminating()
    • stop

      public final void stop()
      Stoppt die Zeichenmaschine.

      Nachdem der aktuelle Frame gezeichnet wurde wechselt die Zeichenmaschine in den Zustand Options.AppState.STOPPED und ruft shutdown() auf. Nachdem teardown() ausgeführt wurde wechselt der Zustand zu Options.AppState.TERMINATED. Das Zeichenfenster bleibt weiter geöffnet.

      Die Zeichenmaschine reagiert in diesem Zustand weiter auf Eingaben, allerdings muss die Zeichnung nun manuell mit redraw() aktualisiert werden.

    • exit

      public final void exit()
      Beendet die Zeichenmaschine vollständig.

      Das Programm wird beendet und alle geöffneten Fenster geschlossen. Falls die Maschine noch läuft, wird sie zunächst nach dem nächsten vollständigen Frame gestoppt.

    • exitNow

      public final void exitNow()
    • quit

      public final void quit()
      Beendet das Programm vollständig.

      Enspricht dem Aufruf quit(true).

      See Also:
    • quit

      public final void quit(boolean exit)
      Beendet das Programm. Falls exit gleich true ist, wird die komplette VM beendet.

      Die Methode sorgt nicht für ein ordnungsgemäßes herunterfahren und freigeben aller Ressourcen, da die Zeichenmaschine gegebenenfalls geöffnet bleiben und weitere Aufgaben erfüllen soll. Aufrufende Methoden sollten dies berücksichtigen.

      Soll das Programm vollständig beendet werden, ist es ratsamer exit() zu verwenden.

      Parameters:
      exit - Ob die VM beendet werden soll.
      See Also:
    • setSize

      public final void setSize(int width, int height)
      Ändert die Größe der Zeichenleinwand.
      Parameters:
      width - Neue Breite der Zeichenleinwand.
      height - Neue Höhe der Zeichenleinwand.
      See Also:
    • getWidth

      public final int getWidth()
      Die Breite der Zeichenleinwand.
      Returns:
      Die Breite der Zeichenleinwand.
    • getHeight

      public final int getHeight()
      Die Höhe der Zeichenleinwand.
      Returns:
      Die Höhe der Zeichenleinwand.
    • setTitle

      public final void setTitle(String title)
      Setzt den Titel des Zeichenfensters.
      Parameters:
      title - Der Titel, der oben im Zeichenfenster angezeigt wird.
    • getCanvas

      public final Zeichenleinwand getCanvas()
      Gibt die Zeichenleinwand zurück.
      Returns:
      Die Zeichenleinwand.
    • addLayer

      public final void addLayer(Layer layer)
      Fügt der Zeichenleinwand eine weitere Ebene hinzu.
      Parameters:
      layer - Die neue Ebene.
    • getLayerCount

      public final int getLayerCount()
      Gibt die Anzahl der Ebenen in der Zeichenleinwand zurück.
      Returns:
      Die Anzahl der Ebenen.
    • getLayer

      public final Layer getLayer(int index)
      Gibt die Ebene am angegebenen Index zurück. Gibt es keine Ebene mit diesem Index.
      Parameters:
      index -
      Returns:
    • getLayer

      public final <LT extends Layer> LT getLayer(Class<LT> layerClass)
      Gibt die erste (unterste) Ebene der angegebenen Klasse zurück.
      
       DrawingLayer draw = getLayer(DrawingLayer.class);
       
      Type Parameters:
      LT -
      Parameters:
      layerClass -
      Returns:
    • getBackgroundLayer

      public final ColorLayer getBackgroundLayer()
      Gibt die Ebene mit der Hintergrundfarbe zurück. Gibt es keine solche Ebene, so wird eine erstellt und der Zeichenleinwand hinzugefügt.

      In der Regel sollte dies dieselbe Ebene sein wie background.

      Returns:
      Die Hintergrundebene.
    • getDrawingLayer

      public final DrawingLayer getDrawingLayer()
      Gibt die Standard-Zeichenebene zurück. Gibt es keine solche Ebene, so wird eine erstellt und der Zeichenleinwand hinzugefügt.

      In der Regel sollte dies dieselbe Ebene sein wie drawing.

      Returns:
      Die Zeichenebene.
    • getShapesLayer

      public final ShapesLayer getShapesLayer()
      Gibt die Standard-Formenebene zurück. Gibt es keine solche Ebene, so wird eine erstellt und der Zeichenleinwand hinzugefügt.

      In der Regel sollte dies dieselbe Ebene sein wie shapes.

      Returns:
      Die Formenebene.
    • getFramesPerSecond

      public final int getFramesPerSecond()
      Gibt die aktuellen Frames pro Sekunde zurück.
      Returns:
      Angepeilte Frames pro Sekunde
    • setFramesPerSecond

      public final void setFramesPerSecond(int pFramesPerSecond)
      Setzt die Anzahl an Frames pro Sekunde auf einen neuen Wert.
      Parameters:
      pFramesPerSecond - Neue FPS.
    • saveImage

      public final void saveImage()
      Speichert den aktuellen Inhalt der Zeichenleinwand in einer Bilddatei auf der Festplatte. Zur Auswahl der Zieldatei wird dem Nutzer ein JFileChooser angezeigt.
    • saveImage

      public final void saveImage(String filepath)
      Speichert den aktuellen Inhalt der Zeichenleinwand in einer Bilddatei im angegebenen Dateipfad auf der Festplatte.
    • snapshot

      public final ImageLayer snapshot()
      Erstellt eine Momentanaufnahme des aktuellen Inhalts der Zeichenleinwand und erstellt daraus eine Bildebene. Die Ebene wird automatisch der Zeichenleinwand vor dem background hinzugefügt.
      Returns:
      Die neue Bildebene.
    • delay

      public final void delay(int ms)
      Pausiert die Schleife der Zeichenmaschine für die angegebene Anzahl an Millisekunden.

      Falls delay() während eines Aufrufs von draw() aufgerufen wird, dann wird der aktuelle Zustand der Leinwand angezeigt.

      Die Methode übernimmt keine Garantie, dass die Wartezeit exakt ms Millisekunden beträgt. Sie kann etwas kürzer oder (für kurze Wartezeiten) etwas länger sein. Für zeitkritische Simulationen sollte daher die genaue Zeitdifferenz gemessen und berücksichtigt werden.

      Parameters:
      ms - Wartezeit in Millisekunden.
    • hideCursor

      public final void hideCursor()
      Macht den Mauszeiger unsichtbar.

      Nach dem Aufruf gilt cursorVisible == false.

      Der Aufruf von hideCursor() ist dasselbe wie der Aufruf von setCursor(null).

    • showCursor

      public final void showCursor()
      Zeigt den Mauszeiger wieder an, falls er zuvor versteckt wurde.

      Nach dem Aufruf gilt cursorVisible == true.

      Der Aufruf von hideCursor() ist dasselbe wie der Aufruf von setCursor(Cursor.DEFAULT_CURSOR).

    • setCursor

      public final void setCursor(Image pCursorImage, int hotSpotX, int hotSpotY)
      Ändert den Mauszeiger auf ein eigenes Bild.

      Das Bild darf die vom Betriebssystem vorgegebene Mindestgröße nicht überschreiten und kann aus einer beliebigen Quelle geladen werden, oder direkt im Programm erstellt werden. Die Koordinaten des Hotspot geben an, an welcher Stelle des Bildes sich die "Spitze" befindet. Die Koordinaten werden relativ zur oberen linken Ecke des Bildes angegeben.

      Parameters:
      pCursorImage - Ein Bild, das den Mauszeiger ersetzt.
      hotSpotX - Relative x-Koordinate des Hotspots.
      hotSpotY - Relative y-Koordinate des Hotspots.
      See Also:
    • setCursor

      public final void setCursor(int pPredefinedCursor)
      Setzt den Mauszeiger auf eines der vordefinierten Symbole.

      Die Konstanten der Klasse Cursor definieren 13 Standardzeiger, die durch angabe der Nummer geladen werden können.

      
       setCursor(Cursor.HAND_CURSOR);
       
      Parameters:
      pPredefinedCursor - Eine der Cursor-Konstanten.
      See Also:
    • setCursor

      public final void setCursor(Cursor pCursor)
      Setzt den Mauszeiger auf das übergebenen Cursor-Objekt. Wenn pCursor null ist, wird der Mauszeiger unsichtbar gemacht (dies ist dasselbe wie der Aufruf von hideCursor()).
      Parameters:
      pCursor - Ein Cursor-Objekt oder null.

      Nach Aufruf der Methode kann über cursorVisible abgefragt werden, ob der Cursor zurzeit sichtbar ist oder nicht.

    • settings

      public void settings()
      Die Settings werden einmal beim Erstellten der Zeichenmaschine aufgerufen.

      settings() wird nur selten benötigt, wenn das Zeichenfenster

    • setup

      public void setup()
      Methode, die von Unterklassen überschrieben werden sollte, um die Zeichenmaschine vor dem Start zu konfigurieren. Hier können vorbereitende Befehle ausgeführt werden, die die Zeichenleinwand zu initialisieren, neue Objekte instanziieren und Variablen initialisieren.
    • update

      public void update(double delta)
      update() wird einmal pro Frame vor draw() aufgerufen, um notwendige Aktualisierungen vorzunehmen. Im Gegensatz zu draw() bekommt update() zusätzlich Constants.delta übergeben, um die Aktualisierungen abhängig von der echten Verzögerung zwischen zwei Frames zu berechnen.

      delta wird in Sekunden angegeben. Um eine Form zum Beispiel um 50 Pixel pro Sekunde in x-Richtung zu bewegen, kann so vorgegangen werden:

      
       shape.move(50*delta, 0.0);
       
      Parameters:
      delta -
    • draw

      public void draw()
      draw() wird einmal pro Frame aufgerufen. Bei einer Framerate von 60 also in etwa 60-Mal pro Sekunde. In der draw-Methode wird der Inhalt der Ebenen manipuliert und deren Inhalte gezeichnet. Am Ende des Frames werden alle Ebenen auf die Zeichenleinwand übertragen.

      draw() stellt die wichtigste Methode für eine Zeichenmaschine dar, da hier die Zeichnung des Programms erstellt wird.

    • shutdown

      public void shutdown()
      teardown() wird aufgerufen, sobald die Schleife des Hauptprogramms beendet wurde. Dies passiert entweder nach dem ersten Durchlauf (wenn keine eigene update(double) erstellt wurde), nach dem Aufruf von stop() oder nachdem das Zeichenfenster geschlossen wurde.

      In teardown() kann zum Beispiel der Abschlussbildschirm eines Spiels oder der Abspann einer Animation angezeigt werden, oder mit saveImage() die erstellte Zeichnung abgespeichert werden.

    • scheduleTask

      public void scheduleTask(Runnable runnable, int delay)
    • scheduleTask

      public void scheduleTask(Runnable runnable, int delay, boolean concurrent)
    • mouseClicked

      public void mouseClicked(MouseEvent e)
    • mouseClicked

      public void mouseClicked()
    • mousePressed

      public void mousePressed(MouseEvent e)
    • mousePressed

      public void mousePressed()
    • mouseReleased

      public void mouseReleased(MouseEvent e)
    • mouseReleased

      public void mouseReleased()
    • mouseDragged

      public void mouseDragged(MouseEvent e)
    • mouseDragged

      public void mouseDragged()
    • mouseMoved

      public void mouseMoved(MouseEvent e)
    • mouseMoved

      public void mouseMoved()
    • mouseWheelMoved

      public void mouseWheelMoved(MouseEvent e)
    • mouseWheelMoved

      public void mouseWheelMoved()
    • keyTyped

      public void keyTyped(KeyEvent e)
    • keyTyped

      public void keyTyped()
    • keyPressed

      public void keyPressed(KeyEvent e)
    • keyPressed

      public void keyPressed()
    • keyReleased

      public void keyReleased(KeyEvent e)
    • keyReleased

      public void keyReleased()
    • fullscreenChanged

      public void fullscreenChanged()