Suche Lösung: Speichern von Objektdaten in externer Datei



  • Sehr geehrte C++-Community,

    momentan schreibe ich an einem "Jump n' Run" Spiel und benutze dafür die Programmiersprache C++ und die Bibliothek Simple DirectMedia Layer. Ich habe auch schon einen eigenen Level-Editor geschrieben und stehe jetzt vor einer Problematik, die ich vorerst garnicht durchdacht habe:

    Ich habe eine Klasse "Level" mit Hindernissen, Gegnern und wichtigen Informationen über das Level selbst. Jetzt möchte ich mit meinem Level-Editor ein Objekt der Klasse in eine Datei speichern, um es in meinem Spiel wieder aufzurufen. Dort sollen dann alle Gegner und Hindernisse mit enthaltenen Daten wieder "entpackt" und geladen werden, sodass sich der Spieler direkt ins Geschehen werfen kann.

    Meine Fragen:

    - welches Verfahren würdet Ihr mir empfehlen, um diese Problematik anzugehen?

    - ich habe etwas von Serialisierung (Boost-Bibliothek) gelesen. Würde diese Thematik der Problemlösung beisteuern?

    - muss ich etwas berücksichtigen, wenn ich SDL-Daten (Surfaces, Rectangles) speichern möchte?

    - wenn ich allgemein Daten für das Spiel speichere - in welchem Format soll dies geschehen? (früher habe ich mit .ini-Dateien gearbeitet, aber diese scheinen mir ziemlich unsicher)

    Vielen Dank im Voraus und ich freue mich über jeden Lösungsansatz.



  • satanfreze schrieb:

    - ich habe etwas von Serialisierung (Boost-Bibliothek) gelesen. Würde diese Thematik der Problemlösung beisteuern?

    Das Speichern und Laden von Programmzuständen zur Laufzeit ist Serialisierung. Also ja. 😉

    satanfreze schrieb:

    - muss ich etwas berücksichtigen, wenn ich SDL-Daten (Surfaces, Rectangles) speichern möchte?

    Ja, du kannst wohl viele Objekte nicht 1:1 speichern, weil sie z.B. Zeiger besitzen, die natürlich nur bei diesem Programmdurchlauf gültig sind. Aber warum willst du SDL_Surface s serialisieren? Es reicht ja, die Spiellogik zu speichern.

    satanfreze schrieb:

    - wenn ich allgemein Daten für das Spiel speichere - in welchem Format soll dies geschehen? (früher habe ich mit .ini-Dateien gearbeitet, aber diese scheinen mir ziemlich unsicher)

    Da gibts viele Möglichkeiten, deren Wahl davon abhängt, wie komplex deine Daten strukturiert sind. Für viele Dinge reichen einfache Textdateien. Bei hierarchischen Strukturen könntest du dir JSON, YAML oder XML anschauen. Falls du Performanceprobleme hast, kannst du mit Binärdateien Portabilität und Komfort gegen Geschwindigkeit eintauschen.



  • Du könntest auch mal einen Blick auf HDF5 werfen, das ist zwar mit Pauken auf Trompeten geschossen aber ich suche noch jemanden, der mir dazu einen Erfahrungsbericht liefern kann :p



  • satanfreze schrieb:

    - ich habe etwas von Serialisierung (Boost-Bibliothek) gelesen. Würde diese Thematik der Problemlösung beisteuern?

    Wenn deine C++-Kenntnisse für die Boost ausreichen, würde ich dir auf jeden Fall zur Boost Serialisation raten!
    Damit sollte das Thema komplett erledigt sein.



  • Danke schonmal für Eure Informationen. Um zu meiner ersten Frage zurückzukommen. Wenn ihr schonmal Spielstände oder erstellte "Level" gespeichert habt, wie habt Ihr das bewerkstelligt?

    Zudem möchte ich verhindern, dass ein Nutzer meines Spiels in einen Unterordner geht und dort einfach mit einem Editor seiner Wahl das gespeicherte Level öffnen kann, und einfach ein paar Werte ändern braucht, um im Spiel weiter zu kommen.



  • satanfreze schrieb:

    Zudem möchte ich verhindern, dass ein Nutzer meines Spiels in einen Unterordner geht und dort einfach mit einem Editor seiner Wahl das gespeicherte Level öffnen kann, und einfach ein paar Werte ändern braucht, um im Spiel weiter zu kommen.

    Das kannst du aber nicht verhindern. Alles, was dein Programm kann, kann der Nutzer auch. Er kann sich ja einfach ein Programm schreiben, dass die Änderung macht.

    Du kannst es also nur schwerer machen. Wenn du Boost Serialization verwendest, dann sind die Sachen schon recht unleserlich. Es soll da auch noch irgendwo ein Binary-Archive existieren. Wenn du das verwendest, ist es zumindest für den 08/15-Nutzer nicht mehr so leicht, die Daten zu verändern.

    Aber verhindern kannst du es nicht.



  • satanfreze schrieb:

    Danke schonmal für Eure Informationen. Um zu meiner ersten Frage zurückzukommen. Wenn ihr schonmal Spielstände oder erstellte "Level" gespeichert habt, wie habt Ihr das bewerkstelligt?

    Habe ich schon länger nicht mehr gemacht. Damals manuell mit std::fstream , da ich noch keine Serialisierungsbibliotheken kannte.

    satanfreze schrieb:

    Zudem möchte ich verhindern, dass ein Nutzer meines Spiels in einen Unterordner geht und dort einfach mit einem Editor seiner Wahl das gespeicherte Level öffnen kann, und einfach ein paar Werte ändern braucht, um im Spiel weiter zu kommen.

    Du kannst zum Beispiel eine Checksumme bzw. einen Hash einbauen, in den die einzelnen Daten einfliessen. Die resultierende Zahl speicherst du ebenfalls in der Datei. Beim Laden berechnest du sie aus den Werten und vergleichst sie mit der gespeicherten, bei Ungleichheit kannst du dann eine Fehlermeldung ausgeben.



  • Das klingt ja schon vielversprechend, Danke! Das mit der Checksumme werde ich zur Kenntnis nehmen und ausprobieren.

    Noch eine Frage zur Serialisierung:

    Zum Thema Serialisierung mit der C++ Boost-Bibliothek habe ich schon einige äußerst nützliche Tutorials lesen können. Nur habe ich dort keinerlei Information darüber erhalten, in welchem Format und an welchem Ort die serialisierten Daten gespeichert werden.

    Wisst Ihr darüber mehr?



  • satanfreze schrieb:

    Zum Thema Serialisierung mit der C++ Boost-Bibliothek habe ich schon einige äußerst nützliche Tutorials lesen können. Nur habe ich dort keinerlei Information darüber erhalten, in welchem Format und an welchem Ort die serialisierten Daten gespeichert werden.

    Das legt das verwendete archive fest. Den mit Boost mitgelieferten, kannst du einfach einen fstream geben. Dann schreiben sie es in eine Datei. Ein stringstream geht natürlich auch.

    Das steht aber auch schon in dem Tutorial in der Dokumentation zu Boost Serialization



  • Danke für die schnelle Antwort. Ich werde erstmal die empfohlenen Vorgehensweisen ausprobieren und Euch das Ergebnis berichten.


Anmelden zum Antworten