Java Micro: Game-API

Aus Wikibooks
Zur Navigation springen Zur Suche springen

Die J2ME Game API ist ein Teil der Low-Level-LCDUI und wurde mit MIDP 2.0 eingeführt. Sie soll Probleme lösen die es bis dato bei der Spielentwicklung gegeben hat. Dazu zählen das Double Buffering, die Kollisionsabfrage zwischen Spielfiguren oder Hindernissen, Scrolling (verschieben des Hintergrunds) und Animation von Hintergrundbildern und Figuren. Die Game API bringt fünf neue Klassen, die in dem Paket javax.microedition.lcdui.game gespeichert sind, mit.

Das sind:

GameCanvas: Ist eine von Canvas abgeleitete Klasse, d.h. sie bietet die Funktionen von Canvas. Darüber hinaus bietet sie standardmässig Double Buffering, eine Funktion getKeyState() die es ermöglicht alle Tasten gleichzeitig abzufragen, die Funktion flushGraphics die Pufferinhalte synchron anzeigt und die Inhalte zum Aufrufer zurück gibt nachdem alle Inhalte sichtbar gemacht worden sind.

LayerManager: Die zum Rendering mehrerer Layer innerhalb eines Spiels, d.h. nähere Objekte überdecken Automatisch Objekte die sich im Hintergrund befinden. Ausserdem unterstützt der LayerManager ein so genanntes View Window. View Windows werden genutzt um nur Teile der berechneten Welt anzuzeigen. Mit Hilfe dieser lassen sich leicht

Layer: Ist eine abstrakte Klasse, die unterteilt in Sprite und TiledLayer. Layer sorgt dafür die Eigenschaften, wie Größe, Position, Sichtbarkeit, von Elementen zu bestimmen.

TiledLayer: Ist eine Sammlung von Image-Objekten die größflächig ausgelegt einen Hintergrund oder ähnliches Bilden können. So könnten zum Beispiel ein paar Image-Objekte zufällig nebeneinander genügen um eine Wiese darzustellen.

Sprite: Ist eine Sammlung von Image-Objekten die nacheinander abgespielt eine Animation ergibt. So könnte aus mehreren aufeinanderfolgenden Bilder Beispielsweise eine Laufanimation dargestellt werden. Dies wird vorallem für Spielfiguren genutzt. Darüber hinaus bietet Sprite die Möglichkeit Image-Objekte zu drehen oder zu Spiegeln und Algorithmen zu Kollisionsabfrage.


import javax.microedition.lcdui.*
public class Spiel extends GameCanvas implements Runnable {
private static final int BILDERPROSEKUNDE = 15;
private static final long BILDERINZEIT = 1000 / BILDERPROSEKUNDE;
private voolatile Thread engine;
...
     public Spiel() {
           super(false); //  Key-Events nicht unterdrücken
           initialisieren(); //  Layer + Sprites vorbereiten
     }
     protected void showNotify() {  // Canvas sichtbar 
           engine = new Thread(this);  //  starte engine      
           engine.start();  //  in neuem thread
     }
     protected void hideNotify() {  //  Canvas unsichtbar
           engine = null;  //  stoppe engine
     }
     public void run() {  //  Game Engine
           Thread thread = Thread.currentThread();
           Graphics g = getGraphics();  //  -> Puffer
           while (thread == engine) {  //  einhalten der Bilder pro Sekunde  
                 long start = System.currentTimeMillis();
                 input();  //  Funktion die Tastenabfragt
                 verarbeiten();  //  Funktion die nächsten Spielschritt berechnet
                 zeichnen();  // Funktion die nächsten Spielschritt zeichnet
                 flushGraphics();  // gibt auf Bildschirm aus
                 long duration = System.current.TimeMillis() - start;
                 if (duration < BILDERINZEIT) {
                       try {
                             Thread.sleep(BILDERINZEIT - duration);
                       }catch(InterruptedException e) {}
                 }
           }
     }
}     
 ...

Das Herz der Application wird von der Klasse Spiel gebildet. Die Logik befindet sich in der als Thread ausgeführten Methode run(). Diese startet sobald ein Canvas auf dem Bildschirm erscheint und endet mit dem verschwindet des Selbigen. Die while-Schleife versucht ständig die gleiche Anzahl an Bildern je Sekunde darzustellen. Sonst sind die wesentlichen Aufgaben der run()-Methode:

  • Das Abfragen der Tasten; input()
  • Berechnen des nächsten Spielschrittes; verarbeiten()
  • Zeichnen der Bilder in Puffer zeichnen()

Spiele mit offenem Sourcecode: http://www.f4.htw-berlin.de/lehrende/schwotzer/lehrveranstaltungen/grundlagen-mobile-anwendungen/projektarbeiten.html