Game Story Event Programmierung

28

Ich habe eine Spiele-Engine in C / C ++ und DirectX entwickelt.

Ich habe eine Kachel-Engine für die Karten, animierte Player / NPC-Sprites, die mit dem NPC, den Menüs und dem Levelwechsel sprechen, aber es gibt kein Spiel, es fühlt sich einfach leer an.

Ich habe mich umgesehen und höre immer wieder Schlagworte, aber ich möchte wissen, wie ich eine Geschichte in mein Spiel implementieren kann.

Einige Leute haben eine Sicherungsdatei genannt, die Flags enthält, die jede mögliche Aktion / jeden möglichen Status im Spiel regeln, aber das klingt lächerlich.

Es ist ein bisschen ehrgeizig, aber ich versuche, ein Spiel wie die älteren Pokemon / Final Fantasy-Spiele zu bekommen.

Weiß jemand, wie diese Spiele funktionieren oder welche Theorie verwendet wird?

Ich habe eine Weile gesucht und würde mich über jeden Input freuen, den die Leute haben.

Skeith
quelle

Antworten:

19

Die Geschichte Ihres Spiels sollte wahrscheinlich in Form eines endlichen Automaten (oder einer Art erweiterten FSA) vorliegen. Wenn bestimmte Ereignisse eintreten, sollten Sie in einen neuen Status wechseln. Auf diese Weise müssen Sie immer nur den aktuellen Status und alle erforderlichen Informationen speichern, um zu wissen, wohin Sie sich in der FSA als Nächstes bewegen müssen (zusammen mit Spielerdetails wie Position, Gesundheit usw.).

Wenn wir zum Beispiel die Pokemon-Spiele absolut vereinfachen, bilden die Turnhallenabzeichen den Hauptzweig der FSA. Sie beginnen in Zustand 0, in dem Sie keine Abzeichen haben, und wenn Sie die Gymnastikleiter besiegen, bewegen Sie sich durch die Zustände, zu Zustand 1, zu Zustand 2 usw. Damit Ihre Spieleinheiten auf den aktuellen Zustand aktualisiert werden, brauchen Sie nur zu gelangen sie auf den aktuellen Stand zu sehen. Zum Beispiel würde ein NPC vor dem 3. Fitnessstudio überprüfen, in welchem ​​Zustand Sie sich befinden, sehen, dass Sie sich in dem Zustand befinden, der 3 Abzeichen entspricht, und dementsprechend antworten (möglicherweise mit einem "Gut gemacht!").

Sie müssen nicht den Zustand von allem auf der Welt speichern. nur der Stand der Geschichte. Die Entitäten selbst wissen, wie sie je nach aktuellem Status reagieren müssen.

Joseph Mansfield
quelle
Interessanter Ansatz und ich mag es, dass es ausprobiert werden muss, aber wie würdest du Nebenaufgaben verfolgen, die nicht vom Verlauf der Geschichte abhängen?
Es hängt wirklich davon ab, wie komplex Ihre Geschichte wird. Es kann am einfachsten sein, mehrere FSAs zu haben (eine für jeden Unterordner), oder Sie benötigen möglicherweise eine komplexe Verzweigung. Sie müssen sich hinsetzen und Ihre Geschichte als Roadmap entwerfen. Wenn Sie verstehen, wie alles ineinander greift, überlegen Sie, wie Sie den aktuellen Zustand speichern können (oder Zustände, wenn er in mehreren auf einmal vorliegen kann). Einige Dinge müssen separat gespeichert werden, wie zum Beispiel die Positionen von NPCs (wenn Sie sie speichern müssen) und die Gesundheit bestimmter Charaktere, da diese nicht von der Geschichte abhängen.
diese FSA, von der Sie sprechen, wo ich eine Erklärung dafür finden würde, vorzugsweise vereinfacht und ohne andere Theorien, die miteinander verflochten sind.
Skeith
Sie können überall alles über Zustandsautomaten lernen, aber in 99,9% der Fälle wird es nicht um Spiele gehen. In einem Einführungsbuch über Berechnungen erfahren Sie mehr darüber, aber Sie brauchen wirklich nicht so viele Details. Sie müssen nur das Konzept verstehen, in Zuständen zu sein und sich zwischen ihnen zu bewegen, wenn bestimmte Ereignisse eintreten. @pwnys Antwort ist wirklich, dass man dasselbe auf eine andere Art und Weise sagt. Das Lesen über FSAs ist jedoch eine gute Möglichkeit, die Konzepte von Zustandsautomaten zu erlernen. Nur Google für eine Einführung in Zustandsautomaten!
Joseph Mansfield
7

Sie könnten eine Reihe möglicher Zustände verwenden, in denen sich Ihr Spiel befindet. Ihre NPCs und Ihre Welt würden diese Zustände kennen und entsprechend reagieren / anzeigen. Möglicherweise möchten Sie auch eine Reihe von Auslösern definieren, die durch bestimmte Aktionen / Ereignisse aktiviert werden.

Zum Beispiel würde das Schlagen eines bestimmten Gegners den Auslöser A aktivieren, der deiner Welt den Zustand S hinzufügt, und in dem Zustand S wird dein Charakter durch einen Stromschlag getötet, wenn er aus dem Versteck seines Gegners austritt. Oder es regnet draußen. Oder Sie finden eine seltene Süßigkeit. Du verstehst den Punkt.

Mit diesen zwei einfachen Ergänzungen zu Ihrem Spiel könnten Sie es viel "lebendiger" machen.

Stelle sicher, dass du auch einen reichen Hintergrund für deine Welt, Charaktere und Handlung erstellst und das Spiel mit diesem Hintergrund konsistent ist. Planen Sie zuerst Ihre Geschichte.

Versuchen Sie auch, Gamedev

pwny
quelle
das ist möglich, aber ich bin sicher, dass Profis eine bessere haben, als das, was Sie sujest mit Hunderttausenden von Booleans und Ints verbunden sind (ich habe es versucht). Ich sehe es einfach nicht als realistische Herangehensweise an ein großangelegtes Spiel. danke für den Link
Stellen Sie sich nicht unbedingt 5 unabhängige überlagerbare Zustände vor. Sie erhalten 32 mögliche Verzweigungen für 5 Boolesche Werte. Ich finde das vernünftig. Triggersysteme werden auch in vielen professionellen Spielen verwendet, vor allem, weil Sie dann das Verhalten mit einer Reihe von Triggern skripten können.
Pwny
2

Wie bereits erwähnt, ist dies eine perfekte Anwendung für eine Zustandsmaschine.

Im Wesentlichen haben Sie eine Art Baumstruktur. Jedes Blatt / jeder Knoten enthält Informationen zum aktuellen Status und Regeln für den Übergang zum nächsten Status. Jeder Knoten kann mehrere Ausgänge enthalten, je nachdem, wie komplex Ihr Plot / Play Flow sein soll.

Ein gutes, sehr loses Analogon dazu ist ein Choose Your Own Adventure- Buch. Jede Seite enthält einen Text, der einen Teil der Geschichte beschreibt und Entscheidungen, die der Spieler treffen kann. Jede Entscheidung führt zu einer anderen Seite. Einige Seiten verweisen möglicherweise auf zuvor besuchte Seiten usw.

Die alten textbasierten Abenteuerspiele wie Zork und Leather Goddesses of Phobos und die berüchtigten Sierra * Quest-Spiele ( SpaceQuest mit Roger Wilco, dem Raumpfleger, ist einer meiner Favoriten ) verwendeten eine sehr einfache Version dieses Systemtyps. Jeder Raum auf einer Karte war ein Staat, mit Ausgängen, die mit anderen Staaten oder Räumen verbunden waren. Das Erfassen eines Elements setzt ein Flag in einem globalen Statusobjekt. Jeder Raum prüfte diese Flags, um festzustellen, welche Charaktere oder Gegenstände in jedem Raum verfügbar waren.

Daher können Ihre Status als Klasse oder Struktur implementiert werden, die jeweils Eigenschaften für Folgendes aufweisen:

Asset-Liste - Liste der Zeiger auf Hintergrundgrafiken und alles andere, was Sie zur Anzeige des Raums / Status / Levels benötigen.

Teilnahmebedingungen - Erfolge, die bereits erreicht sein müssen, um ein Level zu betreten

Ausgänge - Links zu jedem möglichen "nächsten" Ausgang. Nord, Süd, Ost und West sind einige Beispiele dafür, aber Sie können auch Tür1, Teleport usw. einschließen. Wenn Sie versuchen, einen Raum zu verlassen oder feststellen, dass ein Ausgang / eine Tür "offen" ist, kann Ihr Spiel den nächsten Zustand überprüfen um zu sehen, ob die Einstiegsbedingungen erfüllt sind, und um die Art und Weise zu ändern, in der der Ausstieg auf dem Bildschirm angezeigt wird, oder um zu verhindern, dass sich der Spieler in diese Richtung bewegt.

Wenn Sie sich etwas einfallen lassen möchten, können Sie eine andere Version eines Staates mit unterschiedlichen Zugangsbedingungen einbinden, wodurch sich die Art und Weise ändert, in der der Raum dem Spieler präsentiert wird, oder die Aktionen, die in diesem Raum verfügbar sind.

Ihr Startbildschirm, Tod / Spiel über dem Bildschirm usw. können Zustände innerhalb des Systems sein, ähnlich wie Sie zwischen den Menübildschirmen navigieren können. In der Tat, wenn Sie ein solches Menüsystem haben, können Sie es dafür verwenden. Anstelle von Auf- / Abwärtspfeilen und "Enter" zum Navigieren in einem Menü würden Sie nach bestimmten Ereignissen im Spielbereich suchen, z.

Überlegen Sie aus Sicht des Administrators, ob Sie von der Erstellung eines Verwaltungstools profitieren können, mit dem Sie den Zustandsautomaten erstellen können. Fügen Sie Räume zu einer Karte hinzu, erstellen Sie Verknüpfungen zwischen ihnen, weisen Sie Assets wie Hintergrundbilder usw. zu. Dies ist wahrscheinlich zu viel für Ihren ersten Versuch. Es ist zu einfach, sich in die Erstellung von Admin-Tools zu vertiefen und das Spiel nie zu beenden. Denken Sie daran - Sie schreiben keine Middleware, sondern ein Spiel.

Hoffe das hilft.

3Dave
quelle
Dieses Beispiel zeigt eine Stadt. Ich habe eine Datei, die das Kachel-Layout sowie die Grafik und Größe, Listen von NPC und allgemeine Dinge wie das enthält. Durch Hinzufügen einer Datei kann dem Spiel eine neue Stadt hinzugefügt werden, die es anderen ermöglicht, Beiträge zu leisten, oder so war der Plan, aber die Datei wird etwas voller und komplexer. Wenn ich Sie verstehe, würde ich die Ereignisse, die in der genannten Stadt stattfinden können, in diese Datei mit Flags einfügen, um den Fortschritt zu verfolgen.
Skeith
@Skeith ja, das klingt nach einem vernünftigen Ansatz.
3Dave
0

Früher habe ich diese Spiel-Engine namens VERGE verwendet . Spielen Sie damit herum und sehen Sie, wie es mit Ereignissen umgeht. Ich mag es wirklich. Es ist Open Source zu, so können Sie sehen , wie sie es umsetzen, hier . Hier ist eine kurze Beschreibung.

Jede Karte verfügt über verschiedene Ebenen. Die grafischen Ebenen, von denen es mehrere geben kann. Die Hindernisschicht. Und dann ist da noch die Zonenschicht. Die Zonenebene ist hier wichtig. *

Jedes Plättchen hat eine Nummer, die angibt, zu welcher Zone es gehört. Jede Zone kann auf zwei grundlegende Arten aktiviert werden. Entweder wird die Zone aktiviert, wenn der Spieler sie betritt, oder sie verfügt über eine sogenannte benachbarte Aktivierung. Benachbarte Aktivierung bedeutet, dass die Zone aktiviert wird, wenn der Spieler neben einem der Zonenkärtchen steht und eine als Aktivierungsschlüssel angegebene Taste drückt.

Wenn eine Zone aktiviert wird, ruft sie eine Funktion aus einem Skript auf. Sie müssen also eine Art Skriptsprache einbetten. VERGE hat eine eigene Sprache namens VergeC und erlaubt auch lua. Ich selbst benutze lieber Python.

Sobald Sie diese Hürde überwunden haben, haben Sie jetzt eine enorme Leistung in Ihrem Event-Scripting. Sie haben eine vollwertige Programmiersprache, in der Sie Daten wie Spielerstatistiken, Story-Flags usw. speichern und bearbeiten können.

* Es gibt auch eine Entity-Ebene. Entitäten verhalten sich wie mobile benachbarte aktivierte Zonen.

Benjamin Lindley
quelle
Das klingt nach dem System, das in der RPG-Game-Maker-Serie verwendet wird. Aber was ist, wenn dieses Plättchen 5 verschiedene Ereignisse hat, je nachdem, wie weit Sie in der Geschichte sind?
Skeith
@Skeith Kann es nicht. Jeder Kachel ist nur eine Zone zugeordnet. Und jede Zone hat nur eine Skriptfunktion, die sie aufruft. Das ist aber kein Problem. Denken Sie daran, dass Sie hier eine vollwertige Programmiersprache haben. Informationen darüber, wie weit Sie in der Geschichte sind, werden in einer Variablen (oder mehreren) gespeichert. Um zu entscheiden, was zu tun ist, müssen Sie lediglich diese Variable im Skript testen und die entsprechende Aktion basierend auf ihrem Wert ausführen.
Benjamin Lindley
@Skeith: Obwohl Sie möglicherweise die Option hinzufügen, die Zone zu ändern, zu der eine Kachel gehört.
Benjamin Lindley