Ich weiß, dass die meisten Spiele Dialogtext in Dateien speichern, aber ich habe auch gesehen, dass einige textbasierte Spiele den Inhalt (Karte, Auswahlmöglichkeiten, mögliche Spielerbefehle, Text der Story) tatsächlich in den Spielcode programmieren.
Ich kann mir ein paar Gründe vorstellen, aber was ist der Hauptgrund, warum sogar Textspiele alles in Dateien außerhalb des Programms aufbewahren?
Die Implementierungsdetails unterscheiden sich nur geringfügig zwischen dem Speichern von Inhalten im gängigen XML-Format, dem Parsen und dem Rendern von Karten / Anzeigen von Text auf der Grundlage der aus der XML-Datei erstellten Variablen sowie dem vollständigen Verzichten auf die XML-Datei. Sie haben beide Zeichenfolgen, die auf dem Bildschirm ausgegeben werden. Ist der Unterschied nicht nur Notation?
Einige Spiele enthalten sogar Grafiken (ASCII-Grafiken?) Im Code. Ich weiß, dass dies nicht richtig ist, und ich kann ein paar Gründe erraten, warum es schlecht ist, aber ich weiß auch nicht, warum.
Es ist sehr beliebt, den größten Teil des Inhalts außerhalb des Programms zu haben. Selbst Dwarf Fortress verwendet keine tatsächlichen ASCII-Zeichen, sondern Bilder von ASCII-Zeichen, die in den Speicher geladen werden.
Ich frage in erster Linie, weil es ein bisschen wie eine PITA ist, XML-Dateien zu erstellen, zu analysieren und mit ihnen zu arbeiten. Weißt du ... im Vergleich zu der faulen Alternative, einfach jeden einzelnen Dungeon (Inhalt) zu einer eigenen Klasse zu machen.
just making every unique dungeon (content) its own class.
Das hat mich nur erschaudern lassen. Die Trennung von Daten und Logik ist für mich ein so grundlegendes Prinzip, dass ich mich wundere, dass es immer noch Entwickler gibt, die dagegen verstoßen.Antworten:
Dafür gibt es mehrere Gründe. Ich werde nur ein paar erwähnen:
if
S,switch
Es und so weiter führen. Das führt dann zu fehleranfälligem Code, der schwer zu lesen und schwerer zu debuggen ist.quelle
const
Arrays mit statischer Speicherdauer). Dies erspart Ihnen den gesamten Code und die Laufzeit-Speicherkosten für das Laden / Konvertieren einer externen Datendarstellung zur Laufzeit. Selbstverständlich gelten all Ihre anderen Gründe für die Aufbewahrung externer Daten weiterhin.Don't Starve
folgt diesem Ansatz und es ist eines der am besten geschriebenen Spiele, die ich gesehen habe. Zahlreiche andere Spiele in der Vergangenheit und Gegenwart tun dies ebenso wie Anwendungen (und selten Hilfsprogramme). Insgesamt würde ich sagen, dass Sie außerhalb kleiner Projekte und kleiner Versorgungsunternehmen immer von einer starken Schichtung und Trennung überzeugt sind.Das Einfügen von Spielinhaltsdaten in den Code bedeutet, dass Sie das Spiel selbst neu kompilieren müssen, um eine mögliche Änderung oder Iteration dieser Spielinhaltsdaten festzustellen. Das ist aus zwei Gründen schlecht:
Viele Sprachen, in denen Spiele geschrieben sind, haben lange Kompilierungszeiten. Insbesondere C ++ kann in dieser Hinsicht sehr schlecht sein, und C ++ ist eine sehr verbreitete Sprache für große kommerzielle Spiele. Bei Sprachen wie C # und Java ist dies weniger ein Problem, aber es ist immer noch nicht so schnell, wie Spieldaten in externen Dateien zu speichern, die während des Spielbetriebs im laufenden Betrieb neu geladen werden können, um Änderungen zu erkennen.
Viele Spiele werden von Teams entwickelt, die häufig aus nicht-technischen Entwicklern (Designern und Künstlern) bestehen, die Inhalte produzieren. Nicht nur technisch nicht versierte Leute möchten das Spiel nicht neu kompilieren müssen oder sich nicht mit "umständlichen Programmierwerkzeugen" befassen, um ihren Inhalt zu iterieren. Es kann auch wünschenswert sein, die Gefährdung des Quellcodes nur für die Programmierer zu minimieren (weil die weniger Leute wer Zugriff auf den Quellcode haben, desto weniger Personen können ihn aus Versehen oder nicht auslassen.
Ich denke, Sie überschätzen die Komplexität des Ladens von Daten aus Text- oder XML-Dateien. Meistens sollten Sie dazu eine Bibliothek verwenden, was das Parsen des XML / JSON / whatever erheblich vereinfacht. Ja, das Schreiben eines datengesteuerten Level-Ladesystems ist im Vorfeld etwas kostenintensiv, spart aber auf lange Sicht viel Zeit im Vergleich zu Tonnen einzigartiger Klassen zur Darstellung der einzelnen Levels.
Kleinere oder einfachere Spiele können möglicherweise weniger von der langfristigen Investition in einen datengetriebenen Ansatz profitieren. Wenn die Entwickler also keine vorhandenen Frameworks / Engines verwenden, die diesen Ansatz unterstützen, ist es möglicherweise effizienter, die Daten einfach zu codieren der Spielcode.
Es gibt natürlich eine Vielzahl von Gründen, warum ein bestimmtes Spiel seine Daten in externen Dateien ablegen kann (oder nicht). es ist nicht machbar, sie alle aufzulisten. Auf einer gewissen Ebene werden sie sich normalerweise alle auf die zusätzliche Iterationsgeschwindigkeit oder Flexibilität beschränken, die das Nicht-Neu-Erstellen-des-Spiels bieten kann.
quelle
Wie immer, wie immer kommt es darauf an. Aber zunächst möchte ich argumentieren, dass Hardcoding für sich genommen nicht schlecht ist.
Ich habe in einigen einfachen Spielen hartcodierten Inhalt, insbesondere Dialogtext, und die Welt ist nicht untergegangen. Wir Programmierer lieben es, Dinge zu abstrahieren, aber denken Sie daran, dass jede Abstraktionsebene, die Sie erstellen, Ihr Programm komplexer und schwieriger zu verstehen macht.
Wenn Ihr Spiel einfach genug ist, so dass Sie einige Inhalte darin fest codieren können, würde ich es der Einfachheit halber sicherlich in Betracht ziehen.
Dies skaliert jedoch nicht wirklich zu sehr. Der häufigste Grund für das Einfügen von Inhalten in externe Ressourcen ist die Vereinfachung der Teamarbeit, da sich eine Person oder ein Team auf das Schreiben des Spiels konzentrieren kann, während sich eine andere Person auf das Erstellen und Bearbeiten des Inhalts konzentrieren kann.
Es ist jedoch nicht immer ganz einfach, die Grenze zwischen Programm und Inhalt zu ziehen. Man könnte sagen, dass Texturen zu 100% inhaltlich sind; aber was ist mit prozedural erzeugten Texturen? Der Dialogtext kann zu 100% als Inhalt betrachtet werden. Aber was ist, wenn sich der Dialog in Abhängigkeit von Ihren vorherigen Aktionen ändert? Andere Elemente, von denen man annimmt, dass sie zu 100% Teil des Programms sind, wie Skripte oder Shader, könnten ebenfalls als Teil des Spielinhalts angesehen werden. Sollten sie fest codiert sein? sollten sie als externe Ressource geladen werden?
Denken Sie jedoch daran, dass für jede Art von Inhalt, die Sie in Ihrem Spiel unterstützen, ein Lade- und Interpretationscode erforderlich ist. Im Zweifelsfall empfehle ich daher generell, den Inhalt fest zu codieren und ihn nur dann an eine externe Ressource zu übertragen, wenn Sie dies tun Ich brauche diese Flexibilität wirklich (nicht, wenn du denkst, dass du sie brauchst, aber wenn du sie wirklich brauchst)
Schließlich besteht ein Vorteil des Speicherns von Daten in Ressourcendateien darin, dass Sie sie nur dann laden können, wenn Sie sie benötigen (wodurch möglicherweise die Ladezeiten des Spiels verkürzt werden), und sie entladen können, wenn Sie sie nicht mehr benötigen (wodurch Sie mehr Inhalt haben als kann in den Speicher passen). (Nitpickers 'corner: Ressourcen-DLLs könnten als externe Ressourcen angesehen werden.)
quelle
Ein wichtiger Grund für das Speichern in Textdateien ist die Wiederverwendbarkeit. Wenn Sie ein Text-Game-Framework erstellen, das Ihre Karten, Dialoge und andere Ressourcen aus einer Textdatei liest, können Sie Ihr Framework für andere Spiele wiederverwenden. Über Text-Spiele hinaus bringen so große Budget-Titel wie Call of Duty jedes Jahr ein neues Spiel heraus.
Ein weiterer Grund ist die Portabilität. Sie können dieselben Dateien für Web, PC, Mac, Android usw. verwenden. Sie müssen lediglich Ihr Framework für diese verschiedenen Plattformen nachahmen, und der Großteil der Spieldaten bleibt unberührt.
Wenn Sie über textbasierte Spiele hinausgehen, bei denen ein Skript und Daten in Dateien gespeichert sind, verkürzen Sie die Neukompilierungszeiten und können eine Benutzeroberfläche erstellen, mit der Sie die Daten einfacher bearbeiten können.
quelle
Um Änderungen zu beschleunigen, wird die Entwicklung bei größeren Produktionen tonnenweise beschleunigt.
Sie müssen nicht jedem beibringen, wie man in die Quelle einsteigt und sie bearbeitet, um einfache Änderungen vorzunehmen. Indem Sie es aus dem eigentlichen Code ziehen, haben mehr Leute die Möglichkeit, herumzuspielen, es ist einfacher herauszufinden, mit welchen Optionen Sie herumspielen können, und der gesamte Prozess der Feinabstimmung verschiedener Teile Ihres Spiels nimmt viel weniger Zeit in Anspruch. Auch Fragen und Antworten können dabei helfen.
quelle
Ich kann nicht glauben, dass dies noch niemand erwähnt hat, aber ein großer Grund ist, die Lokalisierung VIEL einfacher zu machen. Wenn Sie Englisch, Französisch, Deutsch, Spanisch, Portugiesisch, Italienisch, Russisch, Chinesisch und jede andere Sprache unterstützen möchten, die Sie anstreben, müssen Sie für jede Sprache einen eigenen Code-Behind verwenden. Es bedeutet auch, dass Sie, wenn Sie bestimmte Inhalte entfernen müssen (lesen Sie: Zensur), Ihren Code selbst ändern müssen, um dies zu vermeiden, anstatt zu sagen: "Ersetzen Sie einfach dieses Analsuch-Minispiel durch dieses passiv-aggressive Banner, das grafisch erklärt, was vor sich geht ". Es ist auch ziemlich unfreundlich für Verbraucher, da sie wahrscheinlich das Spiel neu starten müssen, um die Sprache zu ändern, da Sie andere Bibliotheken laden müssen. Endlich,
Wenn Sie jedoch externe Ressourcen verwenden, bedeutet die Unterstützung verschiedener Sprachen nur das Laden einer anderen Ressourcendatei. Dies kann leicht durchgeführt werden, während das Spiel läuft. Dies bedeutet, dass Sie eine einzige Codebasis haben können, was die Entwicklung erheblich vereinfacht. Außerdem können Sie auf einfache Weise die Unterstützung für andere Sprachen nach dem Release hinzufügen. Schließlich können Sie dem Benutzer erlauben, die Installation bestimmter Sprachen zu deaktivieren (eine Funktion, die in Spielen nicht allzu häufig vorkommt, die aber immer noch möglich ist), um Speicherplatz und Bandbreite zu sparen.
quelle
Ich denke, ein Schlüsselbegriff ist die Trennung von Bedenken .
Wenn Ihr Code den Text nicht enthält, wird der Code weniger komplex. Der Programmierer, der den Code schreibt, muss nicht über den spezifischen Text nachdenken und kann sich auf den Code konzentrieren.
Er muss nicht über Lokalisierung nachdenken. Die Person, die die Lokalisierung durchführt, muss sich nicht um den Code kümmern.
quelle
Ich denke, es ist zu einfach, der Typ zu sein, der nicht mehr weiß und es wärmstens zu empfehlen, eine externe Textressourcendatei zu verwenden.
Warum? Denn hier haben Sie die Wahl, die Kosten / Probleme / Vorteile jeder Lösung auszugleichen.
Wenn Sie eine externe Datei verwenden ... Nun, ich denke, die anderen Antworten erklären die Vorteile gut genug. Aber was ist mit den Kosten? Sie müssen einen gültigen Formalismus definieren, einen Interpreter erstellen, ein Dateiformat festlegen und noch schlimmer ... eine andere Anwendung erstellen - einen Editor -. Ein Problem von 0,00%, wenn Sie Mitglied eines Teams mit 50 Programmierern sind, das ein großes Projekt erstellt. Aber wenn Sie allein sind: Sie sind ins Stocken geraten.
Auch hier unterschätze ich nicht die enormen Flexibilitätsvorteile einer externen Ressource: Die datengesteuerte Programmierung scheint mir der richtige Weg für Videospiele zu sein. Vergessen wir aber nicht die Kosten.
Auf der anderen Seite ermöglicht der Text im Code ein schnelles Prototyping, weshalb er beim ersten Mal bevorzugt werden sollte. Dann wäre mein Rat, wenn das Projekt ausgereift ist, die Art der Daten zu analysieren, die zur Modellierung der Dialoge erforderlich sind (Stimmung / Verlaufszustand / ...). Dann entscheiden Sie sich irgendwann für ein Klassen- / Regel- / Dateiformat und entscheiden sich für das Original, sodass andere Personen den Code bearbeiten / vom Inhalt entkoppeln können und so weiter. ODER für ein Spiel mit einfachen Dialogen (Mario ...) halten Sie die Kosten einfach für zu hoch und halten die wenigen Zeichenfolgen / Verhaltensweisen fest.
Ihr Anruf.
(Bemerkung zur Lokalisierung: Es ist nur eine Hash-Tabelle entfernt, also ein unabhängiges und leicht lösbares Problem.)
quelle
Ich denke, die Lizenzierung kann auch ein Grund sein, Inhalte nicht in den Code aufzunehmen.
Zum Beispiel,
quelle