Spielzustand-Automaten

Aus Spieleprogrammierer-Wiki
Wechseln zu: Navigation, Suche

Bitte beachte, dass dieser Artikel noch unvollständig ist! Hilf mit, ihn fertigzustellen.
Näheres dazu findest du ggf. auf der Diskussionsseite. Wenn du der Meinung bist, dass der Artikel vollständig ist, kannst du diesen Hinweis entfernen.

Jeder Spieleentwickler beschäftigt sich früher oder später mit der Frage, wie man am besten mit den verschiedenen Phasen eines Spiels umgeht. Allein wenn man beim Planen schon voraus denkt, fällt einem eine logische Aufteilung auf: Hauptmenü, Charaktererstellung, Hauptspiel, Optionsmenü, Multiplayer-Einstellungen, usw. Zwischen diesen verschiedenen Teilen des Spiels soll natürlich auch problemlos gewechselt werden – und das auch in verschiedenen Kombinationen. Für dieses Problem gibt es eine gute Lösung, welche das Problem der Aufteilung mit Übergangen abstrahiert und abbildet: Spielzustand-Automaten.

Inhaltsverzeichnis

Grundidee und Architektur

UML-Klassendiagramm eines Spielzustand-Automaten

Die Grundidee der Spielzustand-Automaten lässt sich in zwei Klassen teilen: Den Zustands-Manager StateManager und ein Interface State. Jedes Spiel definiert eine Menge an Zuständen in Form einer Klasse, die das Interface State implementiert. Der StateManager kennt und besitzt alle Zustände und identifiziert diese über eine ID. Im Folgenden wird auf beide Klassen näher eingegangen.

State

State definiert ein Interface für den StateManager. Dieses wird von den konkreten Spielzuständen implementiert. Für einen Spielzustand können abhängig von der Situation unterschiedliche Schnittstellen interessant sein. Grundsätzlich können folgende prinzipiell notwendig sein:

StateManager

Der StateManager verwaltet alle für das Spiel möglichen Zustände. Dazu werden ihm alle Zustände durch AddState bekannt gemacht. Für den StateManager ist immer genau ein Zustand aktuell. Dieser lässt sich mit der Methode SetState festlegen.

Prinzipiell verwendet man bei Spielen getrennte Logik für Update- und Render-Funktionalität. Daher unterscheidet der StateManager auch zwischen diesen beiden Vorgängen, indem es getrennte Methoden gibt. Diese rufen vom aktuellen Zustand Update bzw. Render auf.

Beispielimplementierung

State

In C++

class State
{
public:
    virtual ~State() { };
    virtual void OnInit() = 0;
    virtual bool IsInitialized() = 0;
    virtual void OnEnter() = 0;
    virtual void OnLeave() = 0;
    virtual bool OnUpdate(float elapsedTime) = 0;
    virtual void OnRender() = 0;
};

In C#

public interface State
{
	void OnInit();
	bool IsInitialized { get; }
	void OnEnter();
	void OnLeave();
	bool OnUpdate(float elapsedTime);
	void OnRender();
}

StateManager

In C++

In C#

Vor- und Nachteile

Erweiterungsmöglichkeiten

Meine Werkzeuge
Namensräume
Varianten
Aktionen
Navigation
Werkzeuge