Verhalten - eine Zustandsmaschine ohne Kopfschmerzen

Published on January 21, 2019

Verhalten - eine Zustandsmaschine ohne Kopfschmerzen

  • Tutorial
Der Standardansatz zur Beschreibung der Abfolge von Benutzereingaben und Reaktionen auf diese (z. B. bei der Steuerung eines Charakters in einem Spiel) ist eine Zustandsmaschine. Er führt jedoch häufig zu schwerfälligen Programmen, deren Verständnis erheblichen Aufwand erfordert oder die sogar auf Papier skizziert werden müssen. In diesem Artikel schlage ich eine kleine Verschiebung in der Beschreibung vor, mit der Sie Bildschirmplatz und Gehirnressourcen sparen können.


image

Die Verschiebung in der Beschreibung liegt in der Verwendung von Koroutinen. Um diese Technik anwenden zu können, müssen Sie sich vorstellen, welches Verhalten wir letztendlich vom Computer erwarten. Aus diesem Grund habe ich die kleine Bibliothek, die ich für diese Aufgabe erstellt habe, "Behaviours" genannt.

Wenn ein Benutzer mit einem Programm interagiert, wartet der Computer auf eine bestimmte Aktion und reagiert auf eine bestimmte Weise auf Eingaben. Primitive Verhaltensweisen und ihre Kombinationen können umständliche Zustandsautomaten (State Machines) ersetzen, die häufig formal oder informell in Programmen vorkommen. Wenn ein Programm beispielsweise darauf wartet, dass eine Taste gedrückt wird, können wir sagen, dass es das Verhalten waitForKey (...) ausführt. Praktischerweise werden Verhaltensweisen im Gegensatz zu Zustandsautomaten in einer leicht lesbaren Form kombiniert. Ein einfaches Beispiel für Drag & Drop:

* DragAndDrop =
    * draggedObject = ждем MouseDown на каком-то объекте
    * First
        * ждем MouseUp
        * Forever
            * ждем MouseMove
            * Двигаем draggedObject

Verhalten hat einen Anfang, ein Ende und kann einen Wert zurückgeben. Verhaltensweisen werden der Reihe nach ausgeführt oder können mithilfe von Kombinatoren parallel ausgeführt werden. Beispielsweise führt der erste Kombinator mehrere Verhalten parallel aus und endet, wenn eines der Verhalten beendet ist, und gibt sein Ergebnis zurück. Forever - Wiederholt die Ausführung eines bestimmten Verhaltens bis ins Unendliche. Im Gegensatz zur Ausführung einer Funktion blockiert Behaviour nicht den Hauptthread der Ausführung, sodass endlose Behaviours sehr nützlich sein können.

Ich habe Behaviors mit Funktionen implementiert, die primitive Ereignisse (wie MouseDown, MouseUp, MouseMove, ...) als Parameter empfangen und ein Objekt der folgenden Form ausgeben:

{
    done: true|false,
    value: result value
}

Sie können die Implementierung hier sehen: behavior.js auf GitHub und das Drag & Drop-Beispiel hier: jsFiddle .

Wo kann ich Verhalten anwenden?

  • Computerspiele - Es ist sehr praktisch, Logik und KI zu schreiben und manchmal sogar alles mit Verhalten zu tun, einschließlich Animation und Bewegung von Objekten, aber Sie müssen die Leistung überwachen
  • Tutorial im Frontend (Rundgang durch neue Funktionen) - wir zeigen Informationen an, warten auf Benutzerinteraktion, fahren je nach Eingabe fort, der gesamte Code befindet sich an einer Stelle und liest sich fast wie Pseudocode
  • Der Parser einer subjektorientierten Sprache ist ein idiomatischer Code, bei der Eingabe muss nicht nach vorne geschaut werden, da mehrere Verhalten parallel ausgeführt werden können

Foto: Verhalten von Nick Youngson CC BY-SA 3.0 Alpha Stock Images