Tutorial: Multitasking
Inhaltsverzeichnis
Ziel
Nach erfolgreichem Abschluss dieses Tutorials kannst du Multitasking mit der Engine Alpha realisieren, also nebenläufige Prozesse realisieren, zum Beispiel einen Countdown.
Einführung
Eines der wichtigsten Konzepte der Engine Alpha ist das Ticker-Konzept. Es ermöglicht Multitasking. Es ist zwar nicht unbedingt nötig, um ein Spiel zu programmieren, wird jedoch bei den meisten Spielen gebraucht.
Das Ticker
-Interface
Ein Ticker ist etwas, das immer wieder periodisch einen Tick macht.
Hierbei ist ein solcher Tick eine Methode, die immer wieder aufgerufen wird. Bei jedem Aufruf kann man zum Beispiel:
- Ein Spielobjekt bewegen
- Einen Kollisionstest machen
- Spielpunkte rauf-/runterzählen
- usw.
Ein Ticker ist als ein Interface mit einer einzigen abstrakten Methode definiert.
/**
* Diese Methode soll periodisch immer wieder aufgerufen werden.
*/
public void tick()
Damit kann jede Klasse dieses Interface implementieren und damit einen Tick haben. In dem Tick kann ein Spielschritt gemacht, ein Punktezähler erhöht oder ein Spielzustand geändert werden; das Ticker-Prinzip ist sehr vielseitig.
Ein Ticker sorgt im Spiel meist für Bewegung.
Nun schreiben wir eine einfache Klasse, die dieses Interface implementiert:
import ea.*;
/**
* Dieser Ticker zaehlt aufwaerts und schickt jede Runde eine Nachricht an
* die Konsole
*/
public class MeinTicker
implements Ticker //Implementieren des Ticker-Interfaces!
{
/**Der Rundenzaehler*/
private int zaehler;
/**Der Konstruktor*/
public MeinTicker() {
zaehler = 0;
}
/**
* Die tick()-Methode. Sie ueberschreibt die abstrakte tick()-Methode des
* <code>Ticker</code>-Interfaces.<br />
* Diese Methode soll in Regelmaessigen Abstaenden aufgerufen werden.
*/
public void tick() {
zaehler = zaehler + 1; //Rundenzaehler um 1 erhoehen
System.out.println("Dies ist Runde " + zaehler + ".");
}
}
Dieser Ticker sendet bei jedem Tick eine neue Konsolennachricht mit Angabe der aktuellen Runde.
Den Ticker "zum Laufen bringen"
Leider funktioniert dieser Ticker noch nicht, denn niemand ruft ihn regelmäßig auf. Dieser Ticker muss der Engine bekannt gemacht werden. Hierfür gibt es eine Klasse, die die Ticker aufruft. Diese Klasse ist die Klasse Manager
.
Über die Methoden anmelden(...)
und abmelden
kann ein Ticker an einem Manager gestartet und angehalten werden.
Bei anmelden wird zusätzlich ein Parameter vom Typ int
verlangt. Dieser gibt an, in wie großen Abständen in Millisekunden die tick()-Methode des Tickers aufgerufen werden soll.
Praktischerweise hat die Klasse Game bereits ein Manager-Objekt mit dem Namen manager
. Du brauchst also keinen neuen Manager erstellen.
Dieser Quellcode kann zum Beispiel auch in der Einführung erstellten Klasse MeinSpiel verwendet werden. Dies wäre der veränderte Konstruktor:
/**
* Konstruktor, erstellt das Spielfenster und alle Hintergrundressourcen in der
* Klasse <code>Game</code>
*/
public MeinSpiel() {
super(400, 300); //Aufruf des Konstruktors der Klasse Game; erstellt ein
//Fenster der Breite 400 und Hoehe 300
MeinTicker ticker = new MeinTicker(); //Erstellen des Tickers
manager.anmelden(ticker, 200); //Anmelden und Starten des Tickers beim
//Manager
//Die Referenz auf diesen manager liegt in der Klasse Game
}
Nun wird beim Erstellen des Spiels ein Ticker erstellt und angemeldet und seine Ausgabe wird an der Konsole gezeigt.
Den Ticker wieder anhalten
Anhalten kann man den Ticker einfach über den Aufruf der folgenden Methode:
manager.anhalten(ticker);
Danach kannst du den Ticker natürlich über die bekannte Methode auch wieder anmelden.
Probleme?
Du kannst ein einfaches Beispielprojekt, das einen Ticker implementiert, herunterladen, testen und einsehen.