Was ist die am häufigsten verwendete Methode oder der am häufigsten verwendete Algorithmus zum Speichern des Spielstatus (Profile)?
Ich habe gesehen, dass Caesar IV mySQL verwendet.
irgendwelche Vorschläge.
Ich bin mir ziemlich sicher, dass dies meistens in einem proprietären (binären) Format geschieht, indem einfach jede Variable aus einer von Ihnen verwendeten Spielstatusstruktur in eine Datei geschrieben oder diese Datei in eine Instanz der Struktur zurückgelesen wird. In C ++ können Sie beispielsweise ein Objekt wie ein Array von Bytes behandeln und es einfach in eine Datei fwrite () oder aus der Datei fread () und wieder in die Objektform umwandeln.
Wenn Sie Java oder eine andere Sprache verwenden, können Sie die Serialisierung verwenden , um die Aufgabe wirklich zu vereinfachen. Die Java-Erklärung befindet sich am Ende dieser Antwort. Andere Sprachen (höher als C ++) haben sicherlich ihre eigenen Serialisierungsbibliotheken oder integrierten Funktionen, die Sie verwenden sollten. Unabhängig davon, wie ineffizient die Serialisierungsroutine sein mag, ist der Festplattenspeicher heutzutage günstig, insbesondere wenn der Spielstatus nicht sehr groß sein sollte, und verhindert, dass Sie eigene Serialisierungsroutinen schreiben und verwalten können.
Sie sollten auf keinen Fall MySQL verwenden (lesen Sie einfach den ersten Satz dieser Rezension ). Wenn Sie aus irgendeinem Grund wirklich eine relationale Datenbank benötigen , verwenden Sie SQLite . Es ist ein leichtgewichtiges Datenbanksystem und existiert in einer einzelnen Datenbankdatei. Bei den meisten Spielen sind relationale Datenbanken jedoch nicht der richtige Weg, und Unternehmen, die versuchen, sie zu verwenden, verwenden sie in der Regel eher als Nachschlagetabelle für Schlüsselwerte als als echte relationale Datenbanken.
Jede Art der Verschlüsselung lokaler Festplattendateien ist nur eine Verschleierung . Jeder Hacker schnüffelt die Daten sofort, nachdem Ihr Programm sie entschlüsselt hat. Ich persönlich bin gegen so etwas, INSBESONDERE gegen Einspieler-Spiele. Meiner Ansicht nach sollten die Besitzer des Spiels (wohlgemerkt zahlende Kunden) das Spiel hacken dürfen, wenn sie wollen. In einigen Fällen kann dies zu einem größeren Gemeinschaftsgefühl führen und es können "Mods" für Ihr Spiel entwickelt werden, die mehr Kunden zu Ihnen bringen. Das jüngste Beispiel, das mir in den Sinn kommt, ist das Portal in Minecraft , das kürzlich veröffentlicht wurde. Es wird auf den Websites der Spielernachrichten im Internet veröffentlicht, und Sie können wetten, dass es die Verkäufe von Minecraft steigerte.
Wenn Sie aus irgendeinem Grund verrückt genug sind, Java für die Spieleentwicklung zu verwenden, wie ich es bin, finden Sie hier eine kurze Erklärung zur Serialisierung in Java:
Halten Sie alle Ihre Spielstatusdaten in einer Klasse, machen Sie die Klasse durch Implementierung serialisierbar
Serializable
, verwenden Sie dastransient
Schlüsselwort, wenn Sie spezielle instanziierte Variablen in die Klasse mischen (transiente Objekte werden nicht serialisiert), und verwenden Sie einfachObjectOutputStream
, um in eine Datei zu schreiben undObjectInputStream
aus einer Datei zu lesen . Das ist es.
[field: NonSerialized]
Wenn Sie Ihren eigenen Code schreiben, beispielsweise in C ++, können Sie Binärdateien verwenden. Binärdateien bieten Ihnen eine Form der Verschlüsselung durch Verschleierung. Aber wie überall im Internet dokumentiert, ist dies eine sehr schwache Form der Sicherheit.
ODER Sie können so etwas wie RapidXML verwenden, wenn Sie eine für Menschen lesbare Lösung wünschen.
Wenn Sie ein Framework verwenden, sehen Sie sich dessen Dateisupportfunktionen an. HTH
quelle
Die meisten Spiele, die ich gesehen habe, verwenden nur handgeschriebenen Code zum Lesen / Schreiben von Binärdateien. Das On-Disc-Format ist häufig eine exakte Kopie des Speicherlayouts eines Objekts.
Es ist schnell, aber aufwändig zu warten, plattformspezifisch und unflexibel.
In letzter Zeit haben einige Spiele SQLite verwendet. Die Leute, mit denen ich gesprochen habe, scheinen es zu mögen.
quelle
Die Serialisierung wird in einigen anderen Antworten erwähnt, und ich stimme zu, dass dies eine vernünftige Lösung ist. Eine Möglichkeit, die fehlschlägt, ist die Versionierung.
Nehmen wir an, Sie veröffentlichen Ihr Spiel und die Leute spielen es und erstellen einige gespeicherte Spiele. Dann möchten Sie in einem späteren Patch einen Fehler beheben oder einige Funktionen hinzufügen. Wenn Sie eine einfache binäre Serialisierungsmethode verwenden und Ihren Klassen ein Mitglied hinzufügen, ist Ihre Serialisierung möglicherweise nicht mit den alten Speicherspielen kompatibel, wenn die Kunden Ihren Patch installieren.
Egal welchen Ansatz Sie verwenden, denken Sie an dieses Problem, bevor Sie das Spiel zum ersten Mal veröffentlichen! Kunden werden nicht glücklich sein, wenn sie nach dem Anwenden eines Patches von vorne beginnen müssen.
Eine Möglichkeit, dies zu vermeiden, besteht darin, dass jeder Basisdatentyp die Methoden Save (Version) und Load (Version) implementiert, die intelligent genug sind, um zu wissen, welche Daten für jede Version des Spiels gespeichert und geladen werden müssen. Auf diese Weise können Sie die Abwärtskompatibilität Ihrer gespeicherten Spiele unterstützen und ordnungsgemäß fehlschlagen, wenn ein Benutzer versucht, ein gespeichertes Spiel aus einer neueren Version des Spiels zu laden, als sie ausgeführt werden.
quelle
Wenn Sie dasselbe Format verwenden können, in dem Sie Ihre Level gespeichert haben, ist dies ein Bonus.
Zum Beispiel könnte ein Spiel wie Peggle ein anfängliches Brettlayout, eine Anzahl von Bällen, eine aktuelle Punktzahl (0 für das anfängliche Brett) usw. haben. Dann kann ein gespeichertes Spiel genau dasselbe Format verwenden.
Wenn Sie dasselbe Format verwenden, können das gespeicherte Spiel und das Laden des Levels Code gemeinsam nutzen, um Ihre Arbeit zu erleichtern!
Bei einem Spiel mit sehr großen Kartendateien kann das gespeicherte Spiel die Kartendatei als Referenz enthalten. Die Dateien der ersten Ebene könnten das Gleiche tun, was es auch einfacher macht, zu dieser Karte zurückzukehren, wenn der Charakter aus irgendeinem Grund an den gleichen Ort zurückkehrt, mit der Ausnahme, dass einige der NPCs tot sind und alle Leichen liegen Über.
quelle