Skip to content

Finite State Machine (FSM)

eisclimber edited this page Feb 7, 2020 · 3 revisions

#Einleitung

Was ist das?

Ein endlicher Automat (engl. FSM) ist eine Menge von Zuständen(States) und Übergängen. Abhängig von der Eingabe wird der Zustand der FSM geändert. Bei dieser Implementation wird eine (normale) Node mit dem FSM-Skript an den gewünschten Owner angehängt. Die States sind ebenfalls Nodes mit einem entsprechenden Skript, die als Kindsknoten der FSM-Node angehängt werden. Die FSM aktualisiert dann nur den State der gerade aktiv ist und der wiederum den Owner. [Mehr dazu auf Wikipedia: https://de.wikipedia.org/wiki/Endlicher_Automat ; Außerdem nutzen wir einen großen Teil des Codes aus folgendem Tutorial: https://www.youtube.com/watch?v=Ty4wZL7pDME]

Wozu?

Die FSM soll das Verhalten der Owner-Szene manipulieren. Dazu werden einzelne Verhaltensweisen/Features isoliert und als eigener State realisiert (z.B. Springen, Idle, Attackieren,...). Das hat zur Folge, dass der Code kürzer und übersichtlicher wird und nicht ein einziger, riesiger Code-Klumpen entsteht. Außerdem trägt es zur Modularität bei.

Dinge zu Beachten

  1. Viele States sind sich sehr ähnlich und unterscheiden sich nur zum Beispiel in der Geschwindigkeit und einer anderen Animation. In solchen Fällen sollten dann Skripte voneinander erben.
  2. Das Script StateController.gd ist nur ein Template. Für die Implementierung muss ein neues Script das von StateController.gd erbt erstellt werden. In diesem muss dann in der Methode initialize_state_map() die StateMap realisiert werden. Sie ist ein Dictionary, die deinem String ein Kindsknoten zuordnet. (z.B. states_map = {"idle" : $Idle, "move": $Move})
  3. Die Export-Variable START_STATE muss bei einer neuen FSM auf den gewünschten Startstate(Kind der FSM) gesetzt werden. Ist sie ungesetzt führt das zum Crash.
  4. ALLE States erben von State.gd (direkt oder indirekt)
  5. Die FSM ist ein geschlossenes System. Das bedeutet: Von Außen (z.B. vom Owner-Skript) sollte es keinen Zugriff auf die States geben und auch nur im Außnahmefall einen State-Wechsel geben. (Kein if $FSM.current_state = "idle": ...)
  6. [NYI] Mit dem Keyword "previous" kann in den vorherigen State gewechselt werden. Dabei werden die Werte bei Neueintritt nicht zurückgesetzt.

Methoden

initialize_state_map():

Hier gibt man mit Hilfe eines Dictionaries die States der FSM an. Dazu wird unter dem Namen des States eine Referenz auf die entsprechende Node gespeichert:

initialize_state_map(): states_map = { "idle" : $Idle, "move": $Move }

_change_state(_state_name)

Die Funktion wechselt in einen neuen State oder mit "previous" in den vorherigen. Dabei werden die Funktionen .exit()
und, falls der State neu ist .enter() aufgerufen.

  • _state_name : Der Name des neuen States. Er muss ein Schlüssel in states_map oder "previous" sein.
Clone this wiki locally