Как я могу написать систему сохранения / загрузки для моей игры?

17

Я пытаюсь найти способ написать систему сохранения / загрузки для моей игры на C ++. На данный момент я делаю все это с использованием бинарных флагов. Кто-нибудь понял, как это сделать по-другому? Я не возражаю против использования двоичного кода, но я хочу знать свои варианты. Я также хочу кое-что, в чем было бы легко проверить статус только одного события, являющегося завершенным или неполным, чтобы решить определенные вещи (большая часть системы предметов в этой игре зависит от того, что игрок сделал или не сделал на протяжении всей игры).

sonicbhoc
источник
1
На самом деле, посмотрев на это, для меня может быть лучше придерживаться Python для этого проекта. Я использую Panda3D в качестве игрового движка, а версия Python более отточена. Это, и я мог бы развиваться быстрее в Python. Кроме того, в python есть встроенный класс сериализации, называемый pickle, что избавляет меня от необходимости его кодирования.
sonicbhoc

Ответы:

5

Сериализация была бы способом, и что касается проверки статуса, у вас могла бы быть логика в методе десериализации, чтобы сделать это.

ThatsGobbles
источник
Я читаю об этом здесь ( parashift.com/c++-faq-lite/serialization.html ), и это выглядит очень интересно. Я никогда не имел дело с сериализацией, так что это будет хорошим опытом для меня. Спасибо!
sonicbhoc
Без проблем! Я также работаю с сериализацией (хотя и в C #) для моей игры. Удачи!
ThatsGobbles
4
имейте в виду: если вы сериализуете, всегда сначала сохраняйте номер версии, а сначала читайте ее обратно. Таким образом, вы можете корректно обрабатывать критические изменения в формате сохраненной игры, обеспечивая (некоторую) обратную совместимость.
LearnCocos2D
4
Во время разработки я также настоятельно рекомендую вам писать файлы в удобочитаемом формате. Может быть, что-то вроде JSON или XML. Намного легче увидеть, было ли сохранено все, что вам нужно, а также гораздо проще настроить данные в уже записанном файле (для тестирования или исправления после записи файла на диск).
Буммзак
5

Я немного изучил исходный код DOOM. Я расскажу вам, как это делается там.

D_DoomMain содержит все функции открытия / сохранения / загрузки, а также множество других вещей. Как говорится в начале файла,

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

По сути, весь файл полон M_CheckParm s от начала до конца. Вот из чего состоит D_DoomLoop. Это один массивный цикл (что-то вроде 1000-2000 строк).

Так как ваш вопрос «Как я могу написать?» Я просто собираюсь вставить некоторые фрагменты кода, относящиеся к игровому листу, из D_DoomMain:

Вот операторы, в которых этот материал используется, в самом конце цикла.

   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

Вот функция, которая обращается к строкам, разбросанным по всему коду:

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

У вас также есть файл p_savegame.c, в котором хранятся все данные, связанные с пользователем (какое у вас оружие, где вы находитесь, на каком уровне и т. Д.).

И, наконец, у вас есть файл, который загружает данные сохраненных игр в игровой сценарий, возможно, самый сложный из всех, потому что он также загружает все остальное. Это называется p_setup.c и находится в том же каталоге.

Для меня catэто хорошо сработало, когда все это было в текстовом буфере, а pipeэтот текст - sendmailна мой собственный адрес электронной почты. Таким образом, я могу читать его в нечетные моменты дня и использовать «найти», когда хочу найти что-то вроде «как DOOM загружает игру». Код хорошо прокомментирован.

ixtmixilix
источник
3

Вы можете сериализовать класс или данные в плоский файл, а затем прочитать его обратно при загрузке.

Олафур Вааге
источник
Из-за корпоративного брандмауэра я не смог добраться до этих ссылок. Сожалею.
sonicbhoc
4
Если ваша корпорация мешает вам читать то, что вам нужно, они в лучшем случае идиоты.
о0 '.
2
Ну, это еще не моя работа. : P (и, возможно, слово «корпоративный» было не лучшим словом ... это брандмауэр в моей школе)
sonicbhoc
-1

Я +1: предложил использовать XML / JSON для структурирования сохраненных игр. Таким образом, вы очень готовы сделать сейвы на «облачной» основе. Или, по крайней мере, у вас будет структура, которую вы можете использовать для будущих проектов, которые могут включать в себя сеть. Пока файлы не хранятся так, чтобы их было слишком легко читать, они должны дать вам массу преимуществ. Нравится метрики! Ура

Фил
источник
1
Облачное хранилище означает, что вы сохраняете сбережения онлайн. Вы можете сделать это с любым форматом файла.
Я знаю это. Но для целей коммуникации может быть хорошей идеей структурировать его так, чтобы его можно было легко передавать.
Фил
Если ваша игра несовместима с собственным форматом сохраняемых файлов, у вас
возникли
Сохранение в XML и JSON будет очень легко изменить (= обман). Как разработчик, вы можете или не можете быть в порядке с этим.
Транг Оул