Gibt es ein allgemein akzeptiertes Muster für die Ausführung verschiedener Aktionen innerhalb eines Spiels? Eine Möglichkeit, wie ein Spieler Aktionen ausführen kann und wie eine KI Aktionen ausführen kann, wie z. B. Bewegung, Angriff, Selbstzerstörung usw.
Ich habe derzeit eine abstrakte BaseAction, die .NET-Generika verwendet, um die verschiedenen Objekte anzugeben, die von den verschiedenen Aktionen zurückgegeben werden. Dies alles wird in einem Muster implementiert, das dem Befehl ähnlich ist, wobei jede Aktion für sich selbst verantwortlich ist und alles tut, was sie benötigt.
Mein Grund dafür, abstrakt zu sein, ist, dass ich möglicherweise einen einzelnen ActionHandler habe und AI einfach verschiedene Aktionen in die Warteschlange stellen kann, die die baseAction implementieren. Der Grund dafür ist, dass die verschiedenen Aktionen Ergebnisinformationen zurückgeben können, die für die Aktion relevant sind (da verschiedene Aktionen völlig unterschiedliche Ergebnisse im Spiel haben können), zusammen mit einigen gemeinsamen Implementierungen von beforeAction und afterAction.
Also ... gibt es einen akzeptierten Weg, dies zu tun, oder klingt das in Ordnung?
quelle
Antworten:
Ich glaube nicht, dass es einen akzeptierten Weg gibt, dieses Konzept umzusetzen, aber ich möchte wirklich gerne mitteilen, wie ich in meinen Spielen normalerweise damit umgehe. Es ist eine Art Kombination aus dem Command- Entwurfsmuster und dem zusammengesetzten Entwurfsmuster.
Ich habe eine abstrakte Basisklasse für Aktionen, die nichts anderes als ein Wrapper um eine
Update
Methode ist, die für jeden Frame aufgerufen wird, und einFinished
Flag, das angibt, wann die Aktion beendet wurde.Ich verwende auch das zusammengesetzte Entwurfsmuster, um eine Art von Aktionen zu erstellen, die andere Aktionen hosten und ausführen können. Auch dies ist eine abstrakte Klasse. Läuft darauf hinaus:
Dann habe ich zwei Implementierungen von zusammengesetzten Aktionen, eine für die parallele Ausführung und eine für die sequentielle Ausführung . Das Schöne ist jedoch, dass Parallelität und Sequenz selbst Aktionen sind und kombiniert werden können, um komplexere Ausführungsabläufe zu erstellen.
Und derjenige, der sequentielle Aktionen regelt.
Wenn dies vorhanden ist, müssen lediglich konkrete Aktionsimplementierungen erstellt und die Aktionen
Parallel
und verwendet werdenSequence
, um den Ausführungsfluss zu steuern. Ich werde mit einem Beispiel enden:Ich habe dieses System bereits erfolgreich verwendet, um das gesamte Gameplay in einem grafischen Abenteuer zu steuern, aber es sollte wahrscheinlich für so ziemlich alles funktionieren. Es war auch einfach genug, andere Arten von zusammengesetzten Aktionen hinzuzufügen, die zum Erstellen von Ausführungsschleifen und Bedingungen verwendet wurden.
quelle
Draw
Methode bereits auf dem Status der Entität basiert und die Änderungen automatisch erfolgen. In einem Renderer im beibehaltenen Modus wie Flash können Sie das beobachtbare Muster verwenden, um Änderungen an Ihren Entitäten vorzunehmen, die auf die Anzeigeobjekte übertragen werden, oder die Verbindung manuell innerhalb der Entität selbst herstellen.Character
Klasse verfügt über einePosition
Eigenschaft und eineDraw
Methode, die den aktuellen Wert von liestPosition
und dort das richtige Bild zeichnet. In dieser Situation müssen Sie nur den Wert aktualisierenPosition
, damit das Ergebnis automatisch auf dem Bildschirm angezeigt wird.Character
einePosition
Eigenschaft haben, diese aber das Rendern an eine ArtSprite
Objekt delegiert, das automatisch von einem Szenendiagramm oder etwas anderem gerendert wird. In dieser Situation müssen Sie sicherstellen, dass sowohl die Position des Charakters als auch die Position des Sprites immer synchron sind, was etwas mehr Arbeit erfordert. In beiden Fällen verstehe ich jedoch nicht, warum der Aktionsmanager etwas damit zu tun haben sollte. :)