Ich mache ein Point-and-Click-Abenteuerspiel und versuche derzeit herauszufinden, wie ein Befehlssystem am besten implementiert werden kann.
Angenommen, eine Benutzeroberfläche im Monkey Island- oder Maniac Mansion-Stil mit einer Palette von Verben und Objekten in der Szene und im Inventar. Wenn Sie darauf klicken, bilden Sie einen Satz, der ausgeführt werden soll.
Sie können beispielsweise auf look at
einen Baum klicken , um "Baum betrachten" zu erhalten, oder auf einen Apfel klicken, und dann give
und dann auf ein Mädchen, um "Apfel an Mädchen geben" zu erhalten.
Es gibt drei mögliche Formen eines Satzes:
verb
, zum Beispiel "speichern"verb noun
, zum Beispiel "Apfel aufheben", "Tintenfisch anschauen"verb noun noun
, zum Beispiel "Gurke dem tollwütigen Hund geben", "Brechstange mit Einmachglas verwenden"
In verschiedenen Situationen möchte ich, dass die auszuführende Aktion von verschiedenen Objekten definiert wird.
Zum Beispiel könnte für das give
Verb eine Standardaktion definiert sein, die den Charakter dazu bringt, etwas wie "Ich würde es vorziehen, daran festzuhalten" zu sagen, oder der tollwütige Hund könnte eine Aktion definieren, bei der er alles frisst, was Sie versuchen, ihm zu geben .
Wenn die Benutzeroberfläche wie Maniac Mansion funktionieren soll, erstellen Sie den Satz und weisen ihn an, ihn auszuführen (in Maniac Mansion entweder durch Klicken auf den Satz oder erneut durch Klicken auf das zuletzt angeklickte Element).
Wenn es wie Monkey Island funktionieren soll, wird der Satz ausgeführt, sobald er vollständig ist. Dies stellt ein Problem für Verben dar, für use
die manchmal ein Substantiv und manchmal zwei verwendet werden.
Wie würden Sie ein System implementieren, das dies handhabt?
quelle
look
ist ein Verb mit einem Substantiv usw.Antworten:
Die Verwendung ist möglicherweise einfacher, wenn Sie die Auswahlreihenfolge umkehren. Der Benutzer klickt also auf ein Substantiv und das Spiel zeigt die Verben an, die für dieses Substantiv ausgeführt werden können. Wenn das Verb ein Objekt erfordert (dh "Give to ___"), wartet das Spiel darauf, dass der Benutzer das Objekt auswählt, bevor er die Aktion ausführt.
Etwas wie:
In Bezug auf die Implementierung muss jedes Objekt im Spiel Daten enthalten für:
Da die Grammatik nicht wirklich verschachtelt ist oder so, sollten Sie nichts so Kompliziertes wie ein Interpretermuster benötigen.
quelle
Ich präsentiere eine vereinfachte Lösung. Es kann natürlich erweitert werden.
Ich denke, eine einfache Liste von (Verb, Objekt1, Objekt2) würde es lösen:
Umgang mit Standardeinstellungen:
Einige Beispiele:
Es kann erweitert werden:
quelle
Hier gibt es zwei Probleme: Die Eingabe des Players in einen Syntaxbaum interpretieren und diesen Baum dann ausführen.
In der ersten Phase würde jede Verbschaltfläche eine konkrete Verbinstanz erstellen, die von einer Verbschnittstelle abgeleitet ist. Dieser Instanz würden weitere Substantive oder Verben zur Validierung übergeben. Wenn dies gültig ist, wird das Substantiv an den internen Syntaxbaum angehängt, andernfalls wird es mit einem entsprechenden Fehler abgelehnt.
Nach jedem Tastendruck können Sie den Verbbaum fragen, ob er sich in einem gültigen Zustand befindet, um fortzufahren (für die Eingabe im Monkey Island-Stil).
Sobald die zweite Stufe erreicht ist, ist das konkrete Verb dafür verantwortlich, seinen eigenen Baum zu analysieren und den Spielstatus zu aktualisieren.
Eine komplexere Lösung würde das Parsen des Baums außerhalb des Verbs beinhalten. Jedes Baumelement wäre für kleine Aktionen verantwortlich, die zusammen das gewünschte Ergebnis liefern. Dieser Ansatz würde es Ihnen ermöglichen, aus kleinen Bausteinen aufkommende Sätze zu bilden.
Weitere Informationen zur Analysephase finden Sie im Interpreter- Muster.
quelle