Ich habe ein Spiel, das zu Beginn des Levels eine zufällige Levelkarte generiert. Ich möchte eine Möglichkeit implementieren, um das Level zu speichern und zu laden.
Ich dachte, XML wäre vielleicht eine gute Option zum Speichern aller Variablen, dann wäre es für mich einfach, etwas zu erstellen, das dieses XML analysieren und genau die gleiche Ebene generieren kann.
Aber XML ist wahrscheinlich übertrieben für meine Bedürfnisse. Ich erinnere mich an die alte Sega-Konsole, die Ihr Spiel nicht speichern konnte (ich glaube, das Worms-Spiel hat es auch getan), dass sie Ihnen eine Menge Charakter geben würde, den Sie aufschreiben konnten. Wenn Sie diese Zeichenfolge später eingeben, wird der genaue Pegel geladen.
Wäre eine "Level-Zeichenfolge" eine gute Option? Wäre es eine Art "base60" -Konvertierung? Wie würde ich das umsetzen?
quelle
Unabhängig davon, welches Format Sie für Ihre Speicherspiele verwenden, geben Sie um Himmels willen eine Versionsnummer ein. Sie können abwärtskompatible Ladevorgänge durchführen, indem Sie auf die Versionsnummer verzweigen, oder Sie können zu alte Speicherungen sicher erkennen Laden.
Sie werden es bereuen, wenn Sie es nicht tun.
quelle
JSON ist gut, aber YAML ist besser. :) http://www.yaml.org/ und http://code.google.com/p/yaml-cpp/ für eine der benutzerfreundlicheren Implementierungen.
YAML ist eine Obermenge von JSON, die Unterstützung für einige nette Funktionen bietet, insbesondere:
quelle
Wenn Sie alle Daten im Spiel serialisieren möchten, würde ich JSON als Dateiformat empfehlen. Aus diesem Grund ist die Verwendung von XML einfacher und die Unterstützung ist in vielen Sprachen sehr gut.
Ich habe diese Bibliothek für C ++ verwendet und sie funktioniert sehr gut.
http://jsoncpp.sourceforge.net/
quelle
XML ist eine gute Wahl, wenn Sie nicht an die Größe gebunden sind und nativ unterstützt werden (z. B. in .NET und Flash). Wenn Sie jedoch ein schlankes Format wünschen, können Sie ganz einfach Ihr eigenes Format und Ihren eigenen Parser erstellen. Normalerweise benutze ich 1 Zeichen, z. Komma, um jedes Objekt zu trennen. Um die Zeichenfolge zu dekodieren, teilen Sie das Komma. Jetzt benötigt jedes Objekt unterschiedliche Eigenschaften. Trennen Sie diese mit einem anderen Zeichen, z. B. einem Semikolon, und verwenden Sie ein anderes Zeichen, um die Eigenschaftsnamen von den Eigenschaftswerten zu trennen, z. Doppelpunkt. Alle können somit einfach ohne Regex einfach mit string.split dekodiert werden. Hier ist ein Beispiel:
Sie können noch mehr Platz sparen, indem Sie die Eigenschaftsnamen auf 1 Zeichen reduzieren, z. B. h für die Gesundheit. Z.B.
Vergleichen Sie mit der JSON-Alternative:
Wenn Sie die Größe Ihrer Zahlen verringern möchten, können Sie sie auch mit dem vollständigen Satz druckbarer UTF16-Zeichen codieren. Dieser Thread hat mich dazu inspiriert, eine Frage zu Stack Overflow zu stellen, wie viele Daten Sie in einen Bildschirmcharakter packen können . Die Antwort scheint irgendwo über 40.000 Werte für eine ganze Zahl zu liegen, wenn es Ihnen nichts ausmacht, Brail-, Kanji- und Schachfiguren zu haben: ♔♕♖♗♘♙♚♛♜♝♞♟
Um eine weitere Größenreduzierung zu erhalten, können Sie mithilfe der Lese- / Schreibreihenfolge bestimmen, welcher Wert welcher ist. Die ersten beiden Zeichen stehen also für die ID, die nächsten beiden für die x-Position, die nächsten beiden für das y, dann für den Winkel und dann für den Zustand usw. Also:
könnte alle die gleichen Informationen wie die anderen Beispiele speichern.
Kachelgitter können nur als Zeichenfolge gespeichert werden, wobei jedes Zeichen einen anderen Kacheltyp darstellt, z.
wo ich Lava bedeuten könnte, 9 Gras usw. bedeuten
quelle
Wenn Sie in .Net codieren, ist XML sehr einfach zu handhaben, da Sie Ihre Level-Klasse mit nur wenigen Zeilen in / aus XML serialisieren / deserialisieren können und dann alles in einer gut verwalteten Klasse.
TheMap ist eine Variable vom Typ Map, in die Sie alle Ihre Daten geladen haben.
Angenommen, Sie haben bereits eine Map-Klasse erstellt, würde dies Ihre Map in XML speichern:
Dies würde dann dieses XML zurück in Ihre Kartenklasse laden, um es erneut im Code zu verwenden.
Ab diesem Zeitpunkt wird Ihre XML-Datei zur einfachen Verwendung in Ihre Klasse geladen.
Was Ihr "Level String" -Problem betrifft, würde das, was zuvor angegeben wurde, großartig funktionieren. Sie könnten einfach die Seed-Nummer als "Level String" verwenden.
Andernfalls können Sie einfach so viele verschiedene Karten vorgenerieren, wie Sie möchten, und sie alle mit einer "Level-Zeichenfolge" speichern lassen, um dann die richtige Karte aufzurufen.
quelle
Ich würde ein einfaches
struct
oder ähnliches Gerät (abhängig von Ihrer Sprache) verwenden, um den gesamten Spielstatus an einem zentralen Ort zu speichern. Wenn Sie den Schutz von Setzern / Gettern wünschen, können Sie die Struktur in a einschließenclass
.Wenn Sie Lust dazu haben, verwenden Sie Bitfelder oder führen Sie die Bitmanipulation einfach selbst mit bitweisen Operatoren durch.
Beachten Sie, dass in einigen Sprachen die Regeln für das Auffüllen und Packen von Strukturen etwas kompliziert sein können - es kann jedoch auch für Ihren Fall keine große Rolle spielen, wenn Sie ein oder zwei Bytes Auffüllen haben.
Möglicherweise können Sie auch ein
#pragma
(z. B.#pragma pack(1)
) oder ein verwenden,__attribute__
um die Struktur eng zu verpacken, wodurch das Auffüllen vermieden wird. Dies kann je nach Compiler und Zielarchitektur funktionieren oder auch nicht.Beachten Sie, dass die Verwendung von Bitfeldern und Pack-Pragmas oder -Attributen die Portabilität verringern kann. In allen Hardwarearchitekturen kann sich auch die Strukturfeldendigkeit (Bytereihenfolge) ändern. Sie sollten dies also vermeiden, wenn Sie Portabilität anstreben.
(Zum Beispiel Pac-Man kann diese Struktur naiv eine Karten-ID oder einen Karten-Seed, eine Pac-Man-x- und -y-Position, vier Geister-x- und -y-Positionen und ein großes Bitfeld für das Vorhandensein oder Fehlen von 32-64 Pellets enthalten. was auch immer das Maximum ist.)
Sobald Sie Ihre Struktur haben, übergeben Sie sie an eine xxencode- Funktion:
Das Schreiben dieser Funktion ist etwas fehleranfällig. Sie müssen Bytes nach Bedarf verschieben und kombinieren, um z. B. 6 Bits gleichzeitig zu erhalten, und dann in ein geeignetes Zeichen übersetzen. Ich persönlich würde versuchen, den Code eines anderen aufzuspüren, es sei denn, ich mache dies zum "Spaß" (und ich würde wahrscheinlich eine Testsuite dafür wollen).
Unterschätzen Sie niemals die Macht der alten Schule
struct
an den richtigen Stellen. Wir haben es hier für GBA- und DS-Spiele verwendet.quelle
XML eignet sich für beliebig strukturierte Dokumente (Elemente können in verschiedenen Ebenen des Baums angezeigt werden) oder zum Einbetten von Fremdformaten (z. B. das Einfügen von SVG in eine XML-Seite). Wenn Sie diese Anforderungen nicht haben, ist es ein wirklich ineffizientes Format, und etwas Einfacheres wie CSV oder JSON ist vorzuziehen.
quelle