Oyunum için nasıl bir Kaydet / Yükle sistemi yazabilirim?


17

C ++ oyunum için bir kaydetme / yükleme sistemi yazmak için bir yol bulmaya çalışıyorum. Şu an itibariyle, her şeyi ikili bayraklar kullanarak yapıyorum. Başka bir şekilde nasıl yapılacağına dair bir ipucu var mı? İkili kullanmayı umursamıyorum ama seçeneklerimi bilmek istiyorum. Ayrıca, belirli şeylere karar vermek için sadece bir olayın durumunu tam veya eksik olarak kontrol etmenin kolay olacağı bir şey istiyorum (bu oyunda bir çok eşya sistemi, oyuncunun yaptıklarına veya yapmadığı şeylere bağlıdır) oyun boyunca).


1
Aslında, ona baktıktan sonra, bu proje için Python'a bağlı kalmam daha iyi olabilir. Panda3D'yi oyun motoru olarak kullanıyorum ve python sürümü daha parlak. Bu ve muhtemelen python'da daha hızlı gelişebilirdim. Ayrıca, python, turşu adı verilen yerleşik bir serileştirme sınıfına sahiptir, bu da bana kodlama zahmetinden kurtarır.
sonicbhoc

Yanıtlar:


5

Serileştirme gitmek için bir yol olacaktır ve durum kontrolüne gelince, bunu yapmak için serileştirme yönteminde mantığınız olabilir.


Burada okuyorum ( parashift.com/c++-faq-lite/serialization.html ) ve çok ilginç görünüyor. Serileştirme ile hiç ilgilenmedim, bu yüzden benim için iyi bir öğrenme deneyimi olacak. Teşekkür ederim!
sonicbhoc

Sorun yok! Oyunum için de (C # olsa da) serileştirme ile çalışıyorum. İyi şanslar!
ThatsGobbles

4
unutmayın: Serileştiriyorsanız her zaman önce bir sürüm numarası saklayın ve önce bunu okuyun. Bu şekilde, (bazı) geriye dönük uyumluluk sağlayarak savegame biçimindeki kırılma değişikliklerini nazikçe halledebilirsiniz.
LearnCocos2D

4
Geliştirme sırasında dosyaları okunabilir bir biçimde yazmanızı şiddetle tavsiye ederim. Belki JSON veya XML gibi bir şey. İhtiyacınız olan her şeyin kaydedilip kaydedilmediğini görmek çok daha kolay ve önceden yazılmış bir dosyadaki verileri değiştirmek çok daha kolay (bir dosyayı diske yazdıktan sonra test etmek veya düzeltmek için).
bummzack

5

DOOM kaynak kodunu biraz çalıştım. Sana orada nasıl yapıldığını anlatacağım.

D_DoomMain, tüm açma / kaydetme / yükleme işlevlerinin yanı sıra başka şeyleri de içerir. Dosyanın başında söylediği gibi,

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

Temel olarak, tüm dosya M_CheckParmbaştan sona s ile doludur . D_DoomLoop bundan oluşur. Bu büyük bir döngü (1000-2000 satır uzunluğunda bir şey).

Sorunuz 'Nasıl yazabilirim?' Ben sadece D_DoomMain gelen oyun kaydetme atıfta bazı kod parçaları yapıştıracağım:

döngünün sonunda, bu şeylerin kullanıldığı ifadeler.

   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

Kod boyunca dağınık bulduğunuz dizelere erişen işlev şunlardır:

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

Ayrıca kullanıcıyla ilişkili tüm verileri (hangi silahlara sahip olduğunuzu, hangi seviyede olduğunuzu vb.) Kaydedecek şeyler içeren p_savegame.c adlı bir dosyanız var.

Ve son olarak, savegame verilerini bir oyun senaryosuna yükleyen dosyaya sahipsiniz, muhtemelen en karmaşık olanı, çünkü her şeyi de yüklüyor. Buna p_setup.c denir ve aynı dizinde bulunur.

catBunların hepsinde bir metin arabelleğine ve pipeo metni sendmailkendi e-posta adresime kadar benim için iyi çalıştı . Bu şekilde günün garip anlarında okuyabilirim ve 'DOOM nasıl oyun yükler' gibi şeyler aramak istediğimde 'find'ı kullanabilirim. Kod iyi yorumlanmıştır.



-1

I +1: Kaydetme oyunları yapılandırmak için XML / JSON kullanma önerisini düzenledi. Bu şekilde tasarrufları "bulut" tabanlı yapmaya hazırsınız. Ya da en azından, gelecekteki projeler için kullanabileceğiniz bir yapıya sahip olacaksınız. Dosyalar okunması çok kolay bir şekilde saklanmadığı sürece, size bir sürü fayda sağlamalıdırlar. Metrikler gibi! Yaşasın


1
Bulut depolama, tasarrufları çevrimiçi olarak depoladığınız anlamına gelir. Bunu herhangi bir dosya biçiminde yapabilirsiniz.

Bunu biliyorum. Ancak iletişim amacıyla, aktarılması kolay bir şeyle yapılandırmak iyi bir fikir olabilir.
Phil

Oyununuz kendi kaydetme dosyası biçimiyle uyumlu değilse, "aktarım kolaylığı" ndan çok daha büyük sorunlarınız var
Gurgadurgen

XML ve JSON tasarruflarının kurcalanması çok kolaydır (= hile). Bir geliştirici olarak, bununla iyi olabilir veya olmayabilir.
Trang Oul
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.