Ich arbeite an einem Spiel, in dem gelegentlich einige Ereignisse im Spiel stattfinden müssen. Ein schönes Beispiel wäre ein Tutorial. Sie starten das Spiel und an mehreren Punkten im Spiel tritt ein Ereignis auf:
- Du triffst auf deinen ersten Feind, das Spiel pausiert und du erhältst eine Erklärung, wie du es tötest.
- Sie haben den ersten Feind getötet und erhalten die Nachricht "Gute Arbeit".
- Sie erhalten einen neuen Gegenstand, ein Menü mit dem Gegenstandstatistik-Popup.
- usw. usw.
Das Spiel, an dem ich arbeite, ist ein Puzzlespiel, bei dem die Regeln im Spiel fast alle gleich sind. Es scheint daher ineffizient zu sein, alle diese Ereignisse in separaten Ebenen fest zu codieren.
Sollte ich diese Ereignisse irgendwie in einer externen Quelle wie XML definieren? Dann schreiben Sie einen Interpreter, der das XML ausliest und die Ereignisanforderungen für das Level festlegt? Ich bin mir nicht sicher, wie ich ein Ereignis definieren könnte, das eintreten sollte, wenn Sie zum Beispiel zwei Feinde getötet haben.
Um es klar zu sagen, ich suche nicht die beste Programmiersprache oder Skriptsprache, um dies zu tun, sondern eher die beste Methode, um damit umzugehen.
Vielen Dank!
Edit: Ein zweites Beispiel, da meine Frage ziemlich schwer zu verstehen war:
Das Problem, das ich habe, ist, einige zusätzliche Aktionen in das Spiel einzufügen, die immer ziemlich gleich sind. Wie bei einem RPG-Kampf ist jeder an der Reihe, wählt eine Fertigkeit usw. - es ist immer dasselbe. Aber was ist, wenn es einen Fall gibt, in dem ich irgendwo dazwischen eine Zwischensequenz zeigen möchte? Es scheint sehr ineffizient zu sein, die gesamte Spielstruktur zu modifizieren, um eine veränderte Kampfklasse mit der enthaltenen Zwischensequenz zu bestehen. Ich frage mich, wie das normalerweise gemacht wird.
quelle
Antworten:
Dies hängt stark davon ab, wie die Ereignisse tatsächlich zwischen Objekten in Ihrem Spiel übertragen werden. Wenn Sie beispielsweise ein zentrales Nachrichtensystem verwenden, können Sie über ein Lernprogrammmodul verfügen, das bestimmte Nachrichten abhört und Lernprogramm-Popups erstellt, wenn bestimmte Nachrichten abgehört werden. Anschließend können Sie festlegen, auf welche Nachricht und welches Popup in einer XML-Datei oder in einer Datei, die vom Lernprogramm-Modul analysiert wird, gewartet werden soll. Durch ein separates Tutorial-Objekt, das den Spielstatus überwacht und Tutorial-Popups anzeigt, wenn es Dinge im Spiel bemerkt, können Sie das Tutorial-Objekt nach Belieben ändern, ohne etwas anderes an Ihrem Spiel ändern zu müssen. (Ist dies das Observer-Muster? Ich bin nicht mit allen Entwurfsmustern vertraut.)
Insgesamt hängt es jedoch von der Komplexität Ihres Tutorials ab, ob es sich lohnt, sich darüber Gedanken zu machen. Das Hardcodieren der Ereignisse in Ihrem Code und / oder in Ihren Levels scheint mir keine große Sache zu sein, nur für eine Handvoll Tutorial-Popups. Ich bin gespannt, was genau Sie vorhaben, um zu vermuten, dass es ineffizient ist, da Sie bei jedem Trigger lediglich eine Nachricht an das Lernmodul senden sollten, etwa TutorialModule.show ("1st_kill").
quelle
Hier sind die Designbeschränkungen, wie ich sie verstehe:
Der Kern-Gameplay-Code kümmert sich nicht um Level-Anforderungen und sollte nicht an den Code gekoppelt werden, der sich mit ihnen befasst.
Gleichzeitig ist es der Kern des Gameplays, der weiß, wann die spezifischen Ereignisse eintreten, die diese Anforderungen erfüllen (einen Gegenstand beschaffen, einen Feind töten usw.).
Unterschiedliche Level haben unterschiedliche Anforderungen, die irgendwo beschrieben werden müssen.
Unter diesen Umständen würde ich wahrscheinlich Folgendes tun: Bilden Sie zunächst eine Klasse, die einem Spiellevel entspricht. Es fasst die spezifischen Anforderungen eines Levels zusammen. Es verfügt über Methoden, die aufgerufen werden können, wenn Spielereignisse eintreten.
Geben Sie dem Kern-Gameplay-Code einen Verweis auf das aktuelle Level-Objekt. Wenn Gameplay Ereignisse auftreten, wird es der Ebene erzählt von Methoden und fordert sie auf:
enemyKilled
,itemPickedUp
usw.Intern
Level
braucht ein paar Dinge:LevelRequirement
Objekten, die die spezifischen Ziele beschreiben, die Sie für diese Ebene benötigen.Wenn Sie ein Level betreten, erstellen Sie ein
Level
mit dem richtigenLevelRequirement
s, richten den Gameplay-Code ein und geben ihm dieses Level.Jedes Mal, wenn ein Spielereignis eintritt, wird es vom Gameplay an weitergegeben
Level
. Dadurch werden wiederum aggregierte Daten berechnet (Gesamtzahl der getöteten Feinde, getötete Feinde dieses Typs usw.). Anschließend werden die Anforderungsobjekte durchlaufen und die aggregierten Daten für jedes Objekt angegeben. Eine Anforderung prüft, ob sie erfüllt ist, und erzeugt in diesem Fall das entsprechende Verhalten (mit dem Tutorial-Text usw.).LevelRequirement
Grundsätzlich braucht zwei Dinge:RequirementType
Aufzählung mit Sachen wieFIRST_KILL
und dann eine großeswitch
, die weiß, wie man jede Art überprüft.)Es bleibt die Frage, wo diese Anforderungen beschrieben werden. Sie könnten so etwas wie XML oder ein anderes Textdateiformat machen. Das ist nützlich, wenn:
Wenn beides nicht der Fall ist, würde ich sie wahrscheinlich nur direkt in Code konstruieren. Einfacher ist immer besser.
quelle
Ich dachte, Sie müssen wissen, wie man diese Ereignisse erstellt, und der Rest des Beitrags handelt davon. Wenn Sie diese Ereignisse nur speichern möchten, verwenden Sie eine relationale Datenbank oder beschreiben Sie sie durch Text und verwenden Sie Skriptsprache (er analysiert und wertet sie aus) Du). :)
Sie möchten, dass Ereignisse erkannt werden (1) und dann einige Aktionen ausführen, die von diesen Ereignissen verlangt werden (Meldung drucken, auf Tastendruck prüfen ...) (2). Sie möchten diese Ereignisse auch nur einmal ausführen (3).
Grundsätzlich möchten Sie nach Bedingungen suchen und dann ein bestimmtes Verhalten festlegen.
Wie erkennt man Ereignisse (1)
Woraus bestehen Ereignisse?
Im Allgemeinen besteht jedes dieser Ereignisse aus:
So speichern Sie diese Ereignisse
In einigen Datenstrukturen:
Sie können es auch in einer relationalen Datenbank speichern, auch wenn es so aussieht, als ob es nicht notwendig ist. Wenn Sie dieses Spiel in großen Dimensionen erstellen möchten, müssen Sie möglicherweise eine erstellen.
Sie müssen dann diese Zeichenfolgen / Dinge analysieren. Oder Sie können eine Skriptsprache wie Python oder LUA oder eine Sprache wie LISP verwenden, die alle für Sie analysieren und ausführen können. :)
Wie benutze ich diese Events in der Spieleschleife? (2)
Sie benötigen diese beiden Datenstrukturen:
Algorithmus:
Wie man diese Aktionen selbst durchführt (2)
Sie erstellen eine Liste von Objekten, die die Funktion "Aktualisieren" haben. Sie werden manchmal als Entities (in der Quake-Engine) oder Actors (in der Unreal-Engine) bezeichnet.
Aktion "etwas sagen"
Aktion "Schlüssel anfordern"
Welche Methoden zu lernen
quelle