Wie kann ich ein Befehlssystem für ein Abenteuerspiel im Point-and-Click-Stil implementieren?

11

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 ateinen Baum klicken , um "Baum betrachten" zu erhalten, oder auf einen Apfel klicken, und dann giveund 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 giveVerb 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 usedie manchmal ein Substantiv und manchmal zwei verwendet werden.

Wie würden Sie ein System implementieren, das dies handhabt?

SpoonMeiser
quelle
1
Es scheint drei Arten von Verben zu geben, eine für Null-Nomen, eine für zwei usw. Sie sind nicht dieselbe Objektklasse. Sie können nicht "Tintenfisch mit Einmachglas betrachten", so lookist ein Verb mit einem Substantiv usw.
Tenpn

Antworten:

10

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:

  1. Benutzer klickt auf einen Cheeseburger.
  2. Das Spiel zeigt ein Menü: "abholen, essen, anschauen, ___ geben".
  3. Der Benutzer wählt "Geben an ___".
  4. Spiel sagt "wem geben?" und wartet darauf, dass der Benutzer auf ein anderes Substantiv (oder eine Abbrechen-Schaltfläche) klickt.
  5. Benutzer klickt auf einen Affen.
  6. Das Spiel gibt dem Affen den Cheeseburger.

In Bezug auf die Implementierung muss jedes Objekt im Spiel Daten enthalten für:

  1. Welche Verben können Sie darauf anwenden?
  2. Für Verben erlaubt es, dass ein Objekt genommen wird, welcher Satz von Objekten angewendet werden kann.
  3. Für jedes Verb oder Verb-Objekt-Paar das Verhalten, das ausgeführt werden soll, wenn der Benutzer dies tut.

Da die Grammatik nicht wirklich verschachtelt ist oder so, sollten Sie nichts so Kompliziertes wie ein Interpretermuster benötigen.

großartig
quelle
+1, sowohl auf der Modellierungsseite der Dinge als auch auf der Schnittstellenseite der Dinge. Ja, meistens stimme ich zu, weil ich es so machen würde, aber ich mag diese Antwort.
Drhayes
Wenn wir uns einig sind, müssen wir beide eindeutig Recht haben. ;)
herrlicher
Sie denken also effektiv, dass das auszuführende Verhalten immer durch das erste Substantiv definiert werden sollte?
SpoonMeiser
1
Ja, ich glaube , mehrere Substantive werden teilen Verhalten (so dass den gleichen Code verwenden würde „Pick up“ für verschiedene Objekte Aufnehmen), aber es macht Sinn für sie das Substantiv zu sein, um den Satz von Verben zu bestimmen , die angewandt werden können dazu. Angesichts der Tatsache, dass die Menge der Substantive sehr groß ist (alles im Spiel) und die Menge der Verben klein ist (wahrscheinlich eine Handvoll Operationen), halte ich es für sinnvoll, dass der Benutzer zuerst ein Substantiv auswählt, da dies die Kombinationen weiter verringert schnell. Und pragmatisch gesehen kann der Benutzer auf eine Sache klicken , um eine Interaktion zu initiieren, und nicht auf ein Wort.
Munificent
So hat es Vollgas gemacht.
Jari Komppa
2

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:

  • Wenn der Spieler auf das Objekt (Verb) "Verwenden" und das Objekt "Ballon" geklickt hat und der Spieler auf das Objekt "Pumpe" geklickt hat und ein Triplett vorhanden ist ("Verwenden", "Ballon", "Pumpe"), haben Sie "Ballon mit Pumpe verwendet".
  • Manchmal ist object2 NULL wie in "use helium" (use, helium, NULL)
  • Der Spieler muss zuerst auf das Objektverb klicken
  • Wenn der Spieler auf etwas klickt, das mit nichts übereinstimmt, sagen Sie "Ich kann das nicht, das ist Unsinn".
  • Natürlich sollten Sie nach jedem Klick überprüfen, ob die Reihenfolge korrekt ist.

Umgang mit Standardeinstellungen:

  • Wenn der erste Klick nicht auf das Verbobjekt erfolgt, suchen Sie nach einer möglichen Standardaktion.
  • Eine Möglichkeit, Standardeinstellungen zu speichern, besteht darin, ein Vierfach zu erstellen (Verb, Objekt1, Objekt2, Standardwert).
  • Eine andere Möglichkeit, sie zu speichern, besteht darin, eine Liste der Standardtripletts zu haben
  • ...

Einige Beispiele:

  • (verwenden, Ballon, Pumpe)
  • (gib, John, Kartoffel)
  • (Gehen, Piranhas, NULL)
  • (Verwendung, Ballon-in-Inventar, Pumpe)
  • (offen, Tür-zu-Dach, NULL), Standard .... Beispiel für eine Standardaktion

Es kann erweitert werden:

  • Füge einige Ereignisse hinzu, die ausgelöst werden sollen (gib dem Spieler etwas, der Spieler sagt "Ich kann das nicht, weil ich ein mächtiger Pirat bin", starte die Zwischensequenz, ändere etwas in der Welt ...)
  • einige Voraussetzungen hinzufügen. Manchmal befindet sich der Ballon möglicherweise im Käfig, sodass Sie ausdrücken müssen, "wenn sich der Ballon nicht im Käfig befindet". Ich denke, ich könnte dies mit Ereignisrechnung oder Prolog angehen oder es mit Funktionszeiger tun ...
  • Manchmal lautet der Satz in der Befehlszeile nicht "Blick auf Loch", sondern wird in "Blick in Loch" umgeschrieben. Dies erfordert nur eine Variable :)
user712092
quelle
1

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.

Tenpn
quelle
1
Ich denke nicht, dass die Interpretation der Spielereingaben ein Problem ist. Sicherlich gibt es nichts so raffiniertes wie das Parsen von Eingaben für ein Textabenteuer, das hier benötigt wird. Die Frage läuft darauf hinaus, wie Sie Ihre Objekthierarchie und Interaktionen gestalten würden, um maximale Flexibilität darüber zu ermöglichen, welches Objekt die tatsächlich auszuführende Aktion definiert.
SpoonMeiser