Wie kann ich ein Save / Load-System für mein Spiel schreiben?

17

Ich versuche herauszufinden, wie ich ein Save / Load-System für mein Spiel in C ++ schreiben kann. Ab sofort mache ich alles mit binären Flags. Hat jemand eine Ahnung, wie es anders geht? Es macht mir nichts aus, Binärdateien zu verwenden, aber ich möchte meine Optionen kennen. Ich möchte auch etwas, bei dem es einfach ist, den Status eines Ereignisses auf Vollständigkeit oder Unvollständigkeit zu prüfen, um über bestimmte Dinge zu entscheiden (ein Großteil des Gegenstandssystems in diesem Spiel hängt davon ab, was der Spieler getan hat oder nicht getan hat im Laufe des Spiels).

sonicbhoc
quelle
1
Eigentlich ist es vielleicht besser, wenn ich mich für dieses Projekt an Python halte. Ich benutze Panda3D als Spiel-Engine und die Python-Version ist ausgefeilter. Das und ich könnte mich wahrscheinlich in Python schneller entwickeln. Außerdem hat Python eine eingebaute Serialisierungsklasse namens pickle, die mir die Mühe erspart, eine zu programmieren.
sonicbhoc

Antworten:

5

Serialisierung ist der richtige Weg, und bei der Statusprüfung kann die Deserialisierungsmethode logisch sein.

ThatsGobbles
quelle
Ich lese hier darüber ( parashift.com/c++-faq-lite/serialization.html ) und es sieht sehr interessant aus. Ich habe mich noch nie wirklich mit Serialisierung beschäftigt, daher wird es eine gute Lernerfahrung für mich. Vielen Dank!
sonicbhoc
Kein Problem! Ich arbeite auch mit der Serialisierung (wenn auch in C #) für mein Spiel. Viel Glück!
ThatsGobbles
4
Denken Sie daran: Wenn Sie serialisieren, speichern Sie immer zuerst eine Versionsnummer und lesen Sie diese zuerst zurück. Auf diese Weise können Sie Änderungen am Savegame-Format problemlos verarbeiten, indem Sie (einige) Abwärtskompatibilitäten bereitstellen.
LearnCocos2D
4
Während der Entwicklung empfehle ich Ihnen außerdem dringend, die Dateien in ein für Menschen lesbares Format zu schreiben. Vielleicht so etwas wie JSON oder XML. Es ist viel einfacher festzustellen, ob alles, was Sie benötigen, gespeichert wurde, und es ist auch viel einfacher, die Daten in einer bereits geschriebenen Datei zu optimieren (zum Testen oder zum Reparieren nach dem Schreiben einer Datei auf die Festplatte).
Bummzack
5

Ich habe den DOOM-Quellcode ein bisschen studiert. Ich sage dir, wie es dort gemacht wird.

D_DoomMain enthält alle Funktionen zum Öffnen, Speichern und Laden sowie eine Reihe anderer Dinge. Wie es am Anfang der Datei steht,

// DESCRIPTION:
//      DOOM main program (D_DoomMain) and game loop (D_DoomLoop),
//      plus functions to determine game mode (shareware, registered),
//      parse command line parameters, configure game parameters (turbo),
//      and call the startup functions.

Grundsätzlich ist die gesamte Datei M_CheckParmvon Anfang bis Ende voller s. Daraus besteht die D_DoomLoop. Es ist eine massive Schleife (etwa 1000-2000 Zeilen lang).

Da ist deine Frage 'Wie kann ich schreiben?' Ich werde nur ein paar Code-Teile einfügen, die sich auf gamesaves beziehen, von D_DoomMain:

Hier sind die Anweisungen, wo das Zeug verwendet wird, ganz am Ende der Schleife.

   p = M_CheckParm ("-loadgame");
   if (p && p < myargc-1)
   {
       if (M_CheckParm("-cdrom"))
           sprintf(file, "c:\\doomdata\\"SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
       else
           sprintf(file, SAVEGAMENAME"%c.dsg",myargv[p+1][0]);
       G_LoadGame (file);
   }


   if ( gameaction != ga_loadgame )
   {
       if (autostart || netgame)
           G_InitNew (startskill, startepisode, startmap);
       else
           D_StartTitle ();                // start up intro loop

   }

   D_DoomLoop ();  // never returns

Hier ist die Funktion, die auf die Zeichenfolgen zugreift, die im gesamten Code verteilt sind:

void M_ReadSaveStrings(void)
{
   int             handle;
   int             count;
   int             i;
   char    name[256];

   for (i = 0;i < load_end;i++)
   {
       if (M_CheckParm("-cdrom"))
           sprintf(name,"c:\\doomdata\\"SAVEGAMENAME"%d.dsg",i);
       else
           sprintf(name,SAVEGAMENAME"%d.dsg",i);

       handle = open (name, O_RDONLY | 0, 0666);
       if (handle == -1)
       {
           strcpy(&savegamestrings[i][0],EMPTYSTRING);
           LoadMenu[i].status = 0;
           continue;
       }
       count = read (handle, &savegamestrings[i], SAVESTRINGSIZE);
       close (handle);
       LoadMenu[i].status = 1;
   }
}

Sie haben auch eine Datei mit dem Namen p_savegame.c, in der alle benutzerbezogenen Daten gespeichert werden (welche Waffen Sie haben, wo Sie sich in welchem ​​Level befinden usw.).

Und schließlich haben Sie die Datei, die Spieledaten in ein Spielszenario lädt, das wohl komplexeste von allen, weil es auch alles andere lädt. Diese Datei heißt p_setup.c und befindet sich im selben Verzeichnis.

Es hat für mich gut geklappt, catdiese alle in einen Textpuffer und pipediesen Text sendmailan meine eigene E-Mail-Adresse zu senden. Auf diese Weise kann ich es in ungeraden Momenten des Tages durchlesen und 'find' verwenden, wenn ich nach Dingen wie 'Wie lädt DOOM ein Spiel?' Suchen möchte. Der Code ist gut kommentiert.

ixtmixilix
quelle
3

Sie können die Klasse oder die Daten in eine flache Datei serialisieren und sie dann beim Laden zurücklesen.

Ólafur Waage
quelle
Aufgrund einer Unternehmens-Firewall konnte ich nicht auf diese Links zugreifen. Es tut uns leid.
sonicbhoc
4
Wenn Ihr Unternehmen Sie am Lesen von Dingen hindert, die Sie für die Arbeit benötigen, sind Sie bestenfalls Idioten.
o0 '.
2
Nun, das ist noch nicht mein Job. : P (und vielleicht "corporate" war nicht das beste Wort ... es ist eine Firewall in meiner Schule)
sonicbhoc
-1

I + 1: Der Vorschlag, XML / JSON zum Strukturieren der gespeicherten Spiele zu verwenden. Auf diese Weise sind Sie sehr darauf vorbereitet, die gespeicherten Daten "cloudbasiert" zu machen. Oder zumindest haben Sie eine Struktur, die Sie für zukünftige Projekte verwenden können, die das Web betreffen könnten. Solange die Dateien nicht auf eine Weise gespeichert werden, die zu einfach zu lesen ist, sollten sie Ihnen eine Menge Vorteile bringen. Wie Metriken! Hurra

Phil
quelle
1
Cloud-Speicher bedeutet nur, dass Sie die gespeicherten Daten online speichern. Sie können das mit jedem Dateiformat tun.
Ich weiß das. Für Kommunikationszwecke kann es jedoch eine gute Idee sein, es mit etwas zu strukturieren, das leicht zu übertragen ist.
Phil
Wenn Ihr Spiel nicht mit seinem eigenen Speicherdateiformat kompatibel ist, haben Sie weitaus größere Probleme als "einfache Übertragung"
Gurgadurgen
XML- und JSON-Speicher sind sehr einfach zu manipulieren (= betrügen). Als Entwickler kann es sein, dass Sie damit einverstanden sind oder nicht.
Trang Oul