Jak napisać system Save / Load dla mojej gry?

17

Próbuję znaleźć sposób, aby napisać system zapisu / ładowania dla mojej gry w C ++. W tej chwili robię to wszystko przy użyciu flag binarnych. Czy ktoś ma pojęcie, jak to zrobić w inny sposób? Nie mam nic przeciwko używaniu plików binarnych, ale chcę poznać moje opcje. Chcę również czegoś, w którym łatwo byłoby sprawdzić status jednego zdarzenia jako ukończonego lub niekompletnego w celu podjęcia pewnych decyzji (wiele systemów przedmiotów w tej grze zależy od tego, co gracz zrobił lub czego nie zrobił w trakcie gry).

sonicbhoc
źródło
1
Właściwie, po przyjrzeniu się temu, może lepiej dla mnie będzie trzymać się Pythona w tym projekcie. Używam Panda3D jako silnika gry, a wersja Pythona jest bardziej dopracowana. To i prawdopodobnie mógłbym rozwinąć się szybciej w Pythonie. Dodatkowo, python ma wbudowaną klasę serializacji o nazwie marynowane, co oszczędza mi kłopotów z kodowaniem jednej.
sonicbhoc

Odpowiedzi:

5

Serializacja byłaby właściwym rozwiązaniem, a jeśli chodzi o sprawdzanie statusu, możesz mieć logikę w metodzie deserializacji.

ThatsGobbles
źródło
Czytam o tym tutaj ( parashift.com/c++-faq-lite/serialization.html ) i wygląda to bardzo interesująco. Nigdy tak naprawdę nie zajmowałem się serializacją, więc będzie to dla mnie dobre doświadczenie edukacyjne. Dziękuję Ci!
sonicbhoc
Bez problemu! Pracuję również z serializacją (choć w C #) dla mojej gry. Powodzenia!
ThatsGobbles,
4
pamiętaj: jeśli serializujesz, zawsze przechowuj najpierw numer wersji, a potem przeczytaj go ponownie. W ten sposób z wdziękiem poradzisz sobie z przełomowymi zmianami w formacie gry, zapewniając (niektóre) zgodność wsteczną.
LearnCocos2D,
4
Podczas programowania gorąco zachęcam również do zapisywania plików w formacie czytelnym dla człowieka. Może coś takiego jak JSON lub XML. O wiele łatwiej jest sprawdzić, czy wszystko, czego potrzebujesz, zostało zapisane, a także o wiele łatwiej dostosować dane w już zapisanym pliku (do testowania lub naprawy rzeczy po zapisaniu pliku na dysku).
bummzack
5

Trochę przestudiowałem kod źródłowy DOOM. Powiem ci, jak się tam robi.

D_DoomMain zawiera wszystkie funkcje open / save / load, a także mnóstwo innych rzeczy. Jak napisano na początku pliku,

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

Zasadniczo cały plik jest pełen M_CheckParmod początku do końca. Z tego składa się D_DoomLoop. To jedna ogromna pętla (około 1000-2000 linii).

Ponieważ twoje pytanie brzmi: „Jak mogę pisać?” Wkleję tylko fragmenty kodu odnoszące się do zapisów gier z D_DoomMain:

oto stwierdzenia, w których te rzeczy są używane, na samym końcu pętli.

   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

Oto funkcja, która uzyskuje dostęp do ciągów znaków, które są rozproszone w całym kodzie:

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

Masz również plik o nazwie p_savegame.c z rzeczami, które zapiszą wszystkie dane związane z użytkownikiem (jaką masz broń, gdzie jesteś na jakim poziomie itp.).

I w końcu masz plik, który ładuje dane zapisu do scenariusza gry, prawdopodobnie najbardziej skomplikowany ze wszystkich, ponieważ ładuje także wszystko inne. Ten nazywa się p_setup.c i znajduje się w tym samym katalogu.

Dla mnie catwszystko działało dobrze w buforze tekstowym i pipeten tekst sendmailna mój własny adres e-mail. W ten sposób mogę go przeczytać w dziwnych momentach dnia i użyć „znajdź”, kiedy chcę szukać rzeczy takich jak „jak DOOM ładuje grę”. Kod jest dobrze skomentowany.

ixtmixilix
źródło
3

Możesz serializować klasę lub dane do płaskiego pliku, a następnie odczytywać je ponownie podczas ładowania.

Lalafur Waage
źródło
Z powodu korporacyjnej zapory sieciowej nie mogłem dostać się do tych linków. Przepraszam.
sonicbhoc
4
Jeśli twoja korporacja uniemożliwia ci czytanie rzeczy, które musisz pracować, to w najlepszym razie są idiotami.
o0 ”.
2
Cóż, to jeszcze nie moja praca. : P (i może „korporacyjny” nie był najlepszym słowem ... to zapora ogniowa w mojej szkole)
sonicbhoc 29.09.10
-1

I +1: zredagowałem sugestię użycia XML / JSON do strukturyzowania zapisywanych gier. W ten sposób jesteś bardzo przygotowany do tego, aby zapisy były oparte na „chmurze”. A przynajmniej będziesz miał strukturę, której możesz użyć do przyszłych projektów, które mogą obejmować Internet. Tak długo, jak pliki nie są przechowywane w sposób zbyt łatwy do odczytania, powinny zapewniać wiele korzyści. Jak metryki! Brawo

Phil
źródło
1
Przechowywanie w chmurze oznacza po prostu, że przechowujesz zapisy online. Możesz to zrobić w dowolnym formacie pliku.
Wiem to. Ale ze względów komunikacyjnych dobrym pomysłem może być ułożenie go w coś łatwego do przeniesienia.
Phil
Jeśli gra nie jest kompatybilna z własnym formatem zapisywania plików, masz znacznie większe problemy niż „łatwość transferu”
Gurgadurgen
Zapisywanie XML i JSON byłoby bardzo łatwe do manipulowania przy (= cheat). Jako programista możesz, ale nie musi to być w porządku.
Trang Oul 27.04.16