Zustandsmaschinen
Einführung
Zustandsautomaten wurden entwickelt, um die Zustandsverwaltung zu vereinfachen.Ein Zustandsautomat befindet sich immer in genau einem Zustand und wechselt zwischen den Zuständen, wenn bestimmte Bedingungen (definiert durch die Auslöser) erfüllt sind. Zustandsgruppen sind eine bequeme Möglichkeit, die gemeinsame Logik mehrerer Zustände zu bündeln, aber die Gruppen sind selbst keine Zustände. Sie bieten größtenteils die gleiche API wie ein Zustand, verteilen aber Verhalten und Auslöser auf alle ihre Unterzustände.
Ein Zustandsautomat setzt sich aus drei Hauptkomponenten zusammen:
- Staaten
- Gruppen
- Auslöser
Zustandsmaschine
Definieren eines Zustandsautomaten
StateMachineDefiner
Bei der Erstellung einer State Machine innerhalb einer Komponente wird eine Instanz von StateMachineDefiner verwendet.
Eigenschaften
Eigentum | Typ | Beschreibung |
---|---|---|
world | World | Hinweis auf die Welt. |
eid | eid | Die Entitäts-ID der aktuellen Komponente |
schemaAttribute | WorldAttribute | Verweis auf das Schema der aktuellen Komponente im World Scope. |
dataAttribute | WorldAttribute | Verweis auf die Daten der aktuellen Komponente im World Scope. |
Der folgende Code ist ein Beispiel für die Definition einer leeren Zustandsmaschine:
ecs.registerComponent({
...
stateMachine: ({world, eid}) => {
// Hier werden Zustände definiert
},
})
StateMachineDefinition
Alternativ können Sie auch eine State Machine unabhängig von einer Komponente erstellen.
Bei der Erstellung einer State Machine außerhalb einer Komponente wird eine Instanz von StateMachineDefinition verwendet.
Eigenschaften
Eigentum | Typ | Beschreibung |
---|---|---|
initialState (erforderlich) | String | Name des Ausgangszustands des Zustandsautomaten |
Staaten (erforderlich) | Record<string, State> | Eine Karte, die die Namen der Staaten und ihre Definition speichert |
Gruppen | StateGroup[] | Eine optionale Liste von Zustandsgruppen. |
const stateMachine = {
initialState: 'a'
states: {
'a': {
onExit: () => console.log('exit a'),
triggers: {
'b': [{ type: 'timeout', timeout: 1000 }],
},
},
'b': { onEnter: () => console.log('enter b')) },
},
groups: [{
substates: ['a', 'b'],
listeners: [{
target: world.events.globalId,
name: ecs.input.SCREEN_TOUCH_START,
listener: (event) => console.log('touch'),
}]
}],
}
Staat
Ein Zustand ist die grundlegende atomare Einheit eines Zustandsautomaten. Sie können direkt oder über die oben beschriebene fließende StateMachineDefiner-API definiert werden. Ein Zustandsautomat befindet sich immer in genau einem Zustand und geht nach benutzerdefinierten Auslösern, die mit dem aktuellen Zustand verbunden sind, über.
Eigenschaften
Eigentum | Typ | Beschreibung |
---|---|---|
Auslöser (erforderlich) | Record<string, Trigger[]>\ | Ausgehende Übergänge, indiziert durch ihren Zielzustand |
onEnter | () => void | Funktion, die beim Eintritt in den Zustand aufgerufen wird |
onTick | () => void | Funktion, die bei jedem Frame aufgerufen wird, während sie sich im Zustand |
onExit | () => void | Funktion, die beim Verlassen des Zustands aufgerufen wird |
Hörer | ListenerParams[] | Parameter für Ereignis-Listener, die beim Eintritt automatisch hinzugefügt und beim Austritt entfernt werden |
Definieren eines Staates
Der folgende Code ist ein Beispiel dafür, wie ein neuer Zustand innerhalb einer State Machine in einer Komponente definiert wird.
ecs.registerComponent({
...
stateMachine: ({world, eid}) => {
const foo = ecs.defineState('foo')
...
}
})
ID
StateIds werden für die Angabe von Übergangszielen verwendet. Kann entweder ein StateDefiner oder der Zustandsname selbst als String sein.
const a = ecs.definestate('a').wait(1000, 'b')
const b = ecs.defineState('b').wait(1000, a)
StateDefiner-Funktionen sind "fließend", d.h. sie geben dieselbe Instanz zurück, so dass Sie mehrere Funktionsaufrufe in einer einzigen Anweisung verketten können.