Über das Entwerfen eines flexiblen Systems von Charakterfähigkeiten in Spielen

Das Fähigkeitssystem des Charakters ist vielleicht das anspruchsvollste an Flexibilität im Spiel. Es ist unmöglich vorherzusagen, welche Zauber in der endgültigen Version oder in nachfolgenden Aktualisierungen erscheinen werden. In diesem Beitrag geht es darum, wie ich den Prozess der Ausführung von Fähigkeiten abstrahiert habe.

Die Fähigkeit selbst ist nichts anderes als eine Reihe von Handlungen. Die Mindestfähigkeitsschnittstelle besteht aus einer Methode: "Anwenden", aber nicht so einfach über die Schwierigkeiten unter dem Schnitt.

Bild

Jede Fähigkeit beginnt mit einer Reihe von Überprüfungen, um festzustellen, ob sie angewendet werden kann. Unter ihnen sind gewöhnliche, wie das Aufladen, die Verfügbarkeit von Mana, das Überprüfen der Entfernung und andere. Hier ist bereits ersichtlich, dass nicht alle Prüfungen von allen Fähigkeiten benötigt werden. Zum Beispiel gibt es Fähigkeiten, die in jeder Entfernung angewendet werden. Das heißt, unterschiedliche Fähigkeiten erfordern vor der Ausführung unterschiedliche Überprüfungssätze. Es ist jedoch klar, dass viele der Prüfungen wiederholt werden und oft viele Fähigkeiten die gleichen Prüfungen erfordern.

Insgesamt wird ein Teil der Prüfungen logisch wiederholt, dh sie müssen wie vereinbart geändert werden, dh sofort an allen Orten. Darüber hinaus sind die Teile der Schecks im allgemeinen Fall unterschiedlich.

Wenn Teile von Prüfungen in separaten Objekten ausgewählt werden, die eine Schnittstelle implementieren und in eine einfach verknüpfte Liste integriert sind, erhalten wir eine Vorlagenverantwortungskette.

Bild

Bei einer erfolgreichen Prüfung des Links wird die Prüfung des nächsten Links gestartet. Wenn kein nächster Link vorhanden ist, kann die gesamte Prüfung als erfolgreich angesehen werden. Zusätzlich zur Prüfung selbst kann der Link auch einen Fehlerbehandler enthalten. Wenn sich beispielsweise bei der Suche nach Mana herausstellt, dass dies nicht ausreicht, kann der Link den Spieler darüber informieren.

Mithilfe der Aufgabenkette können wir für die Fähigkeit [Zweiter Wind] leicht ein zusätzliches Glied einfügen, um zu überprüfen, ob der Charakter einen Bogen oder ein Glied trägt, und um zu überprüfen, ob der Charakter eine Gesundheitsstufe unter 30% hat.

Lassen Sie uns zurückrollen und uns daran erinnern, dass es Kontrollketten gibt, die für viele Fähigkeiten gleich sind. Lassen Sie uns die Essenz der Fähigkeitserfüllungsanforderung hervorheben und jeden der Arten von Testketten mit seiner Klasse beschreiben.

Die Anfrage ist nur erforderlich, um eine Kette von Aufgaben zu erstellen, sie zu starten und abzubrechen, wenn der Spieler den entsprechenden Befehl erteilt.

Bild

Wir werden bereits Ketten in Abfrageimplementierungen erstellen.

Im Moment haben wir bereits gelernt, wie man die Fähigkeit zur Ausführung von Fähigkeiten flexibel testet. Im Falle einer erfolgreichen Prüfung ist es nun weiterhin erforderlich, die Fähigkeit zu erfüllen.

Ich zog es vor, dies zu tun, ohne die Schnittstellen zu ändern, und den letzten immer erfolgreichen Link hinzuzufügen, den die Fähigkeit als Nebeneffekt ausführt. Hier ist ein Beispiel für eine Implementierung:

public class TerminalChecker: ICastChecker { CastChecker next { get; set; } ISkill skill; public TerminalChecker(ISkill skill) { this.skill = skill; } public bool check() { skill.cast(); return true; } } 

Diese Implementierung ermöglicht es uns, Anfragen asynchron zu machen. Dies ist nützlich, wenn wir zusätzliche Informationen vom Benutzer benötigen. Zum Beispiel muss eine Fähigkeit auf einen Bereich angewendet werden, den der Spieler mit der Maus auswählt. Natürlich können Sie das Spiel zu diesem Zeitpunkt nicht stoppen.

Jetzt müssen wir Anfragen mit Fähigkeiten abgleichen. Wir werden dies natürlich unter Verwendung von Polymorphismus tun, indem wir der Fähigkeitsschnittstelle eine Eigenschaft hinzufügen. Zu diesem Zeitpunkt haben wir die Möglichkeiten für diese Schnittstelle erweitert:

Bild

Lassen Sie uns nach all der geleisteten Arbeit darüber nachdenken, was eine Fähigkeit ist. In der aktuellen Implementierung ist dies eine Reihe von Aktionen, denen eine Reihe von Überprüfungen vorausgehen. Beachten Sie, dass wir auf hohem Niveau in keiner Weise von einer bestimmten Spiellogik abhängig sind. Mit der anfänglichen Idee, das System der Fähigkeiten zu beschreiben, das auf Zauber angewendet wird, haben wir ein System erhalten, das es uns nach bestimmten Regeln erlaubt oder nicht erlaubt, willkürliche Aktionen auszuführen.

Aufgrund dieser Eigenschaft kann dieses System jede Änderung der Spielwelt beschreiben. Zum Beispiel eine Verkaufstransaktion oder ein Hochbauteam.

Schauen wir uns noch einmal alles allgemein an

Bild

In diesem Beispiel ist eine Sprint-Fähigkeit eine normale Fähigkeit ohne Ziel. Die Klasse, die die Anforderung für solche Funktionen implementiert, ist NontargetCastRequest, die wiederum eine Überprüfungskette von ManaChecker, CooldownChecker und TerminalChecker bildet.

Der aufrufende Code hängt nicht von den Details der Implementierung dieses Systems ab, dh wir werden die Spiellogik nicht durch Hinzufügen oder Ändern der Fähigkeit brechen.

Dies ist das System der Charakterfähigkeiten in minimaler Form. Diesem Modell fehlen die Mittel, um den aufrufenden Code zu alarmieren, Funktionen auf die Benutzeroberfläche zu übertragen und andere Details des Lebens. Sie können selbst an sie denken.

Source: https://habr.com/ru/post/de454876/


All Articles