Як я можу написати систему збереження / завантаження для своєї гри?


17

Я намагаюся розібратися, як написати систему збереження / завантаження системи для моєї гри в C ++. На сьогоднішній день я все це роблю, використовуючи бінарні прапори. Хтось має підказку, як це зробити іншим способом? Я не проти використовувати бінарне, але хочу знати свої варіанти. Я також хочу щось, у якому було б легко перевірити стан лише однієї події, яка є повною чи неповною для того, щоб вирішити певні речі (багато елементів системи в цій грі залежать від того, що гравець має чи не зробив протягом усього гри).


1
Насправді, подивившись на це, мені може бути краще дотримуватися Python для цього проекту. Я використовую Panda3D в якості ігрового двигуна, а версія python - більш відшліфована. Це, і я, можливо, міг би швидше розвиватися в пітоні. Крім того, у python є вбудований клас серіалізації під назвою pickle, який позбавляє мене від проблеми кодування.
sonicbhoc

Відповіді:


5

Серіалізація - це шлях, і що стосується перевірки статусу, ви можете мати логіку в методі десеріалізації, щоб зробити це.


Я читаю про це тут ( parashift.com/c++-faq-lite/serialization.html ), і це виглядає дуже цікаво. Я ніколи насправді не займався серіалізацією, тому це буде гарним досвідом навчання. Дякую!
sonicbhoc

Без проблем! Я також працюю з серіалізацією (хоч і на C #) для своєї гри. Удачі!
ThatsGobbles

4
майте на увазі: якщо ви серіалізуєте, завжди спочатку зберігайте номер версії, і прочитайте його ще спочатку. Таким чином ви зможете витончено вчинити порушення змін у форматі збереження гри, забезпечивши (деяку) зворотну сумісність.
LearnCocos2D

4
Під час розробки я також наполегливо рекомендую вам писати файли у читаному для людини форматі. Можливо щось на зразок JSON або XML. Набагато простіше зрозуміти, чи збережено все необхідне, а також набагато простіше налаштувати дані у вже написаному файлі (для тестування або виправлення матеріалів після запису файлу на диск).
bummzack

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_CheckParms від початку до кінця. Ось з чого складається 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 завантажує гру". Код добре коментується.


3

Ви можете серіалізувати клас або дані в плоский файл, а потім прочитати їх назад під час завантаження.


Через корпоративний брандмауер мені не вдалося потрапити на ці посилання. Вибачте.
sonicbhoc

4
Якщо ваша корпорація заважає читати речі, вам потрібно працювати, то вони в кращому випадку - ідіоти.
o0 '.

2
Ну, це ще не моя робота. : P (а може бути, "корпоративний" був не найкращим словом ... це брандмауер у моїй школі)
sonicbhoc

-1

Я +1: редагував пропозицію використовувати XML / JSON для структури збережених ігор. Таким чином, ви дуже готові зробити заощадження на основі "хмари". Або, принаймні, у вас буде структура, яку ви можете використовувати для майбутніх проектів, які можуть залучати Інтернет. Поки файли не зберігаються занадто легко для читання, вони повинні надавати вам переваги. Як метрики! Ура


1
Хмарне зберігання просто означає, що ви зберігаєте збережені в Інтернеті. Це можна зробити в будь-якому форматі файлу.

Я знаю це. Але в цілях спілкування може бути хорошою ідеєю побудувати його з чимось легким для передачі.
Філ

Якщо ваша гра не сумісна з власним форматом збереження файлів, у вас набагато більші проблеми, ніж "легкість передачі"
Gurgadurgen

Збереження XML та JSON було б дуже легко підробити (= чит). Як розробник, ви можете, а може і не бути з цим в порядку.
Транг Оул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.