Ich verstehe nicht, wie man eine endliche Zustandsmaschine mit der vom Spieler kontrollierten Entität verwendet.
Zum Beispiel habe ich ein Spiel im Mario-Stil (2d-Plattform). Ich kann springen, rennen, gehen, Schaden nehmen, schwimmen usw. Mein erster Gedanke war also, diese Aktionen als Zustände zu verwenden. Aber was passiert, wenn Sie rennen, wenn Sie Schaden nehmen? Oder gleichzeitig springen, Schaden nehmen und schießen?
Ich möchte dem Player nur Funktionen (Aktionen) auf saubere Weise hinzufügen (nicht für alle Aktionen in der Entitätsaktualisierung verwenden).
Antworten:
Ich denke, der normale Weg ist, mehrere Zustandsautomaten zu haben. Auf diese Weise können Sie sich an atomare Zustände halten, was Ihr Leben oft viel einfacher macht, als mit komplexen Zuständen umgehen zu müssen.
Zum Beispiel:
In der objektorientierten Gestaltung gibt es dafür das Zustandsmuster . Es läuft darauf hinaus, eine Schnittstelle pro Zustandsmaschine zu haben. Und eine Klasse pro möglichem Zustand, die diese Schnittstelle implementiert.
Ein Beispiel: Es gibt eine Schnittstelle DamageMode und Unterklassen NormalDamageMode, InvulnerableDamageMode und InvincibleDamageMode. Immer wenn der Spieler mit einem Feind kollidiert, wird die Methode DamageMode.collision (Feind) aufgerufen. Es wird von der Klasse behandelt, die für den aktuellen Status verantwortlich ist.
Wenn also DamageMode == NormalDamageMode ist, wird der Player beschädigt und die Statusvariable auf InvulnerableDamageMode gesetzt. Im InvulnerableDamageMode passiert nichts und im InvincibleDamageMode wird der Feind beschädigt. Natürlich muss es Timer geben, um von InvulnerableDamageMode und InvincibleDamageMode zu NormalDamageMode zurückzukehren.
Der Hauptvorteil des Statusmusters im Vergleich zu if-elseif-elseif-elseif-Blöcken besteht darin, dass Sie Ihren Code besser strukturieren können.
quelle
Zustände sind keine Aktionen, in Ihrem Spiel steuern sie, wie der Charakter aktualisiert wird (z. B. könnte jeder Zustand seine eigene Funktion update () haben).
Schauen Sie sich das Diagramm auf dieser Seite an: http://en.wikipedia.org/wiki/State_diagram . Die Staaten erzählen uns etwas über die Welt (die Tür ist offen oder geschlossen). Die Aktionen zeigen uns, was die Welt von einem Staat in einen anderen bringt.
In Ihrem Fall könnten Sie Zustände haben wie:
Und der Übergang zwischen Staaten (die Ereignisse / Pfeile zwischen Staaten) wären Eingaben von Spielern und Reaktionen auf die Welt, wie zum Beispiel:
Jeder Staat muss prüfen, ob relevante Ereignisse aufgetreten sind. In der Regel erfolgt dies mit if-Anweisungen.
Das
hit by monster
Ereignis würde ausgelöst und den Spieler in denin pain
Zustand versetzen.Der Spieler würde wieder in den
in pain
Zustand übergehen, in dem Sie Ihr "Hit" -Sprite anzeigen könnten, das den rückwärts fallenden Charakter zeigt.Sie werden if-Anweisungen wahrscheinlich nicht entkommen, aber Sie können tief verschachtelte Anweisungen vermeiden.
quelle