Comment puis-je écrire un système de sauvegarde / chargement pour mon jeu?

17

J'essaie de trouver un moyen d'écrire un système de sauvegarde / chargement pour mon jeu en C ++. En ce moment, je fais tout cela en utilisant des drapeaux binaires. Quelqu'un a une idée sur la façon de procéder autrement? Cela ne me dérange pas d'utiliser le binaire, mais je veux connaître mes options. Je veux aussi quelque chose dans lequel il serait facile de vérifier si un seul événement est complet ou incomplet afin de décider de certaines choses (une grande partie du système d'objets dans ce jeu dépend de ce que le joueur a ou n'a pas fait) tout au long du jeu).

sonicbhoc
la source
1
En fait, après l'avoir regardé, il serait peut-être préférable pour moi de m'en tenir à Python pour ce projet. J'utilise Panda3D comme moteur de jeu et la version python est plus soignée. Cela, et je pourrais probablement développer plus rapidement en python. De plus, python a une classe de sérialisation intégrée appelée pickle, ce qui m'évite d'avoir à en coder une.
sonicbhoc

Réponses:

5

La sérialisation serait la voie à suivre, et en ce qui concerne la vérification de l'état, vous pourriez avoir une logique dans la méthode de désérialisation pour le faire.

ThatsGobbles
la source
Je lis à ce sujet ici ( parashift.com/c++-faq-lite/serialization.html ) et cela semble très intéressant. Je n'ai jamais vraiment traité de sérialisation, donc ce sera une bonne expérience d'apprentissage pour moi. Je vous remercie!
sonicbhoc
Pas de problème! Je travaille également avec la sérialisation (bien qu'en C #) pour mon jeu. Bonne chance!
ThatsGobbles
4
Gardez à l'esprit: si vous sérialisez, stockez toujours un numéro de version en premier et lisez-le en premier. De cette façon, vous pouvez gérer avec élégance les modifications apportées au format de sauvegarde en fournissant (certaines) une compatibilité descendante.
LearnCocos2D
4
Pendant le développement, je vous encourage également fortement à écrire les fichiers dans un format lisible par l'homme. Peut-être quelque chose comme JSON ou XML. Il est beaucoup plus facile de voir si tout ce dont vous avez besoin a été enregistré et il est également beaucoup plus facile de modifier les données dans un fichier déjà écrit (pour tester ou corriger des choses après avoir écrit un fichier sur le disque).
bummzack
5

J'ai étudié un peu le code source de DOOM. Je vais vous dire comment ça se passe là-dedans.

D_DoomMain contient toutes les fonctions d'ouverture / sauvegarde / chargement, ainsi qu'un tas d'autres choses. Comme il est dit au début du fichier,

// 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.

Fondamentalement, le fichier entier est plein de M_CheckParms du début à la fin. C'est en cela que consiste le D_DoomLoop. C'est une boucle massive (quelque chose comme 1000-2000 lignes de long).

Puisque votre question est «Comment puis-je écrire? Je vais juste coller quelques morceaux de code qui se réfèrent à gamesaves, de D_DoomMain:

voici les instructions où ce truc est utilisé, à la toute fin de la boucle.

   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

Voici la fonction qui accède aux chaînes, que vous trouvez dispersées dans le code:

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;
   }
}

Vous avez également un fichier appelé p_savegame.c avec des éléments qui enregistreront toutes les données associées à l'utilisateur (quelles armes vous avez, où vous êtes à quel niveau, etc.).

Et enfin, vous avez le fichier qui charge les données de sauvegarde dans un scénario de jeu, sans doute le plus complexe de tous, car il charge également tout le reste. Celui-ci s'appelle p_setup.c et se trouve dans le même répertoire.

Cela a bien fonctionné pour moi de cattous ces éléments dans un tampon de texte et pipece texte sendmailà ma propre adresse e-mail. De cette façon, je peux le lire à des moments étranges de la journée et utiliser «trouver» lorsque je veux rechercher des choses comme «comment DOOM charge-t-il un jeu». Le code est bien commenté.

ixtmixilix
la source
3

Vous pouvez sérialiser la classe ou les données dans un fichier plat, puis les relire lors du chargement.

Ólafur Waage
la source
En raison d'un pare-feu d'entreprise, je n'ai pas pu accéder à ces liens. Pardon.
sonicbhoc
4
Si votre entreprise vous empêche de lire des choses dont vous avez besoin pour travailler, elles sont au mieux des idiots.
o0 '.
2
Eh bien, ce n'est pas encore mon travail. : P (et peut-être que "entreprise" n'était pas le meilleur mot ... c'est un pare-feu dans mon école)
sonicbhoc
-1

J'ai attribué +1 à la suggestion d'utiliser XML / JSON pour structurer les sauvegardes. De cette façon, vous êtes très prêt à effectuer les sauvegardes sur le "cloud". Ou du moins, vous aurez une structure que vous pourriez utiliser pour de futurs projets qui pourraient impliquer le Web. Tant que les fichiers ne sont pas stockés d'une manière trop facile à lire, ils devraient vous offrir de nombreux avantages. Comme les métriques! Hourra

Phil
la source
1
Le stockage dans le cloud signifie simplement que vous stockez les sauvegardes en ligne. Vous pouvez le faire avec n'importe quel format de fichier.
Je le sais. Mais à des fins de communication, il peut être judicieux de le structurer avec quelque chose de facile à transférer.
Phil
Si votre jeu n'est pas compatible avec son propre format de fichier de sauvegarde, vous avez des problèmes bien plus importants que la "facilité de transfert"
Gurgadurgen
Les sauvegardes XML et JSON seraient très faciles à falsifier (= triche). En tant que développeur, cela peut vous convenir ou non.
Trang Oul