Bagaimana saya bisa menulis sistem Simpan / Muat untuk game saya?

17

Saya mencoba mencari cara untuk menulis sistem save / load untuk game saya di C ++. Sampai sekarang, saya melakukan semuanya menggunakan bendera biner. Adakah yang tahu cara melakukannya dengan cara lain? Saya tidak keberatan menggunakan biner, tetapi saya ingin tahu opsi saya. Saya juga menginginkan sesuatu di mana akan mudah untuk memeriksa status hanya satu peristiwa yang lengkap atau tidak lengkap untuk memutuskan hal-hal tertentu (banyak sistem item dalam permainan ini tergantung pada apa yang pemain miliki atau belum lakukan sepanjang permainan).

sonicbhoc
sumber
1
Sebenarnya, setelah melihatnya, mungkin lebih baik bagi saya untuk tetap menggunakan Python untuk proyek ini. Saya menggunakan Panda3D sebagai mesin gim, dan versi python lebih dipoles. Itu, dan saya mungkin bisa berkembang lebih cepat dengan python. Ditambah lagi, python memiliki kelas serialisasi bawaan yang disebut acar, yang menyelamatkan saya dari kesulitan dalam mengkodekan satu.
sonicbhoc

Jawaban:

5

Serialisasi akan menjadi cara untuk pergi, dan untuk pengecekan status, Anda bisa menggunakan logika dalam metode deserializtion untuk melakukannya.

ThatsGobbles
sumber
Saya membaca tentang ini di sini ( parashift.com/c++-faq-lite/serialization.html ) dan itu terlihat sangat menarik. Saya tidak pernah benar-benar berurusan dengan serialisasi, jadi itu akan menjadi pengalaman belajar yang baik bagi saya. Terima kasih!
sonicbhoc
Tidak masalah! Saya bekerja dengan serialisasi juga (meskipun dalam C #) untuk game saya. Semoga berhasil!
ThatsGobbles
4
perlu diingat: jika Anda membuat serial selalu menyimpan nomor versi terlebih dahulu, dan membacanya kembali terlebih dahulu. Dengan begitu Anda dapat menangani perubahan yang melanggar pada format savegame dengan anggun dengan memberikan (beberapa) kompatibilitas.
LearnCocos2D
4
Selama pengembangan saya juga sangat menyarankan Anda untuk menulis file ke format yang dapat dibaca manusia. Mungkin sesuatu seperti JSON atau XML. Jauh lebih mudah untuk melihat apakah semua yang Anda butuhkan telah disimpan dan juga lebih mudah untuk mengubah data dalam file yang sudah ditulis (untuk pengujian atau untuk memperbaiki hal-hal setelah menulis file ke disk).
bummzack
5

Saya telah mempelajari sedikit kode sumber DOOM. Saya akan memberitahu Anda bagaimana hal itu dilakukan di sana.

D_DoomMain berisi semua fungsi buka / simpan / muat, serta banyak hal lainnya. Seperti yang tertulis di awal file,

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

Pada dasarnya, seluruh file penuh M_CheckParms dari awal hingga selesai. Terdiri dari apa itu D_DoomLoop. Ini satu lingkaran besar (panjang sekitar 1000-2000 baris).

Karena pertanyaan Anda adalah 'Bagaimana saya bisa menulis?' Saya hanya akan menempelkan beberapa bit kode yang merujuk ke gamesave, dari D_DoomMain:

di sini adalah pernyataan di mana barang-barang itu digunakan, pada akhir dari loop.

   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

Inilah fungsi yang mengakses string, yang Anda temukan tersebar di seluruh kode:

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

Anda juga punya file bernama p_savegame.c dengan hal-hal yang akan menyimpan semua data terkait pengguna (senjata apa yang Anda punya, di mana Anda berada di level mana, dll).

Dan akhirnya Anda punya file yang memuat data savegame ke dalam skenario gim, bisa dibilang yang paling kompleks dari semuanya, karena itu juga memuat semua yang lain. Yang itu disebut p_setup.c, dan terletak di direktori yang sama.

Ini bekerja dengan baik bagi saya untuk catsemua ini menjadi buffer teks dan pipeteks ke sendmailalamat email saya sendiri. Dengan begitu saya bisa membacanya pada saat-saat aneh pada hari itu, dan menggunakan 'temukan' ketika saya ingin mencari hal-hal seperti 'bagaimana DOOM memuat permainan'. Kode ini dikomentari dengan baik.

ixtmixilix
sumber
3

Anda bisa membuat cerita bersambung kelas atau data ke file datar dan kemudian membacanya kembali saat Anda memuat.

Ólafur Waage
sumber
Karena firewall perusahaan, saya tidak dapat mengakses tautan itu. Maaf.
sonicbhoc
4
Jika perusahaan Anda mencegah Anda dari membaca hal-hal yang Anda butuhkan untuk bekerja, mereka adalah idiot.
o0 '.
2
Nah, ini belum pekerjaan saya. : P (dan mungkin "perusahaan" bukan kata terbaik ... ini firewall di sekolah saya)
sonicbhoc
-1

I +1: mengedit saran untuk menggunakan XML / JSON untuk menyusun struktur save game. Dengan cara ini Anda sangat siap untuk membuat penghematan berdasarkan "cloud". Atau setidaknya, Anda akan memiliki struktur yang dapat Anda gunakan untuk proyek masa depan yang mungkin melibatkan web. Selama file tidak disimpan dengan cara yang terlalu mudah dibaca, mereka akan memberi Anda banyak manfaat. Suka metrik! Hore

Phil
sumber
1
Penyimpanan cloud hanya berarti Anda menyimpan menyimpan secara online. Anda dapat melakukannya dengan format file apa pun.
Saya tahu itu. Tetapi untuk tujuan komunikasi, bisa menjadi ide bagus untuk menyusunnya dengan sesuatu yang mudah ditransfer.
Phil
Jika gim Anda tidak kompatibel dengan format penyimpanan sendiri, Anda memiliki masalah yang jauh lebih besar daripada "kemudahan transfer"
Gurgadurgen
XML dan JSON saves akan sangat mudah untuk diubah (= cheat). Sebagai pengembang, Anda mungkin atau mungkin tidak setuju dengan itu.
Trang Oul