ฉันจะเขียนระบบบันทึก / โหลดสำหรับเกมของฉันได้อย่างไร


17

ฉันกำลังพยายามหาวิธีเขียนระบบบันทึก / โหลดสำหรับเกมของฉันใน C ++ ณ ตอนนี้ฉันทำทุกอย่างโดยใช้ค่าสถานะไบนารี ใครมีเบาะแสเกี่ยวกับวิธีการทำวิธีอื่นได้หรือไม่ ฉันไม่สนใจการใช้ไบนารี แต่ต้องการทราบตัวเลือกของฉัน ฉันต้องการบางสิ่งบางอย่างซึ่งมันจะง่ายต่อการตรวจสอบสถานะของเหตุการณ์หนึ่งที่กำลังสมบูรณ์หรือไม่สมบูรณ์เพื่อที่จะตัดสินใจบางสิ่ง (ระบบไอเท็มจำนวนมากในเกมนี้ขึ้นอยู่กับสิ่งที่ผู้เล่นมีหรือยังไม่ได้ทำ ตลอดระยะเวลาของเกม)


1
ที่จริงหลังจากดูมันอาจจะดีกว่าถ้าฉันจะติดกับ Python สำหรับโครงการนี้ ฉันใช้ Panda3D เป็นเกมเอ็นจิ้นและรุ่นงูหลามนั้นดูมีความละเอียดยิ่งขึ้น และฉันอาจจะพัฒนาได้เร็วขึ้นในไพ ธ อน นอกจากนี้หลามยังมีคลาสการทำให้เป็นอนุกรมในตัวที่เรียกว่า pickle ซึ่งช่วยฉันในการเข้ารหัสปัญหา
sonicbhoc

คำตอบ:


5

การทำให้เป็นอันดับเป็นวิธีที่จะดำเนินต่อไปและสำหรับการตรวจสอบสถานะคุณอาจมีตรรกะในเมธอด deserializtion


ฉันกำลังอ่านเกี่ยวกับที่นี่ ( 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 ประกอบด้วย มันเป็นวงขนาดใหญ่หนึ่งวง (ยาว 1,000-2,000 บรรทัด)

เนื่องจากคำถามของคุณคือ 'ฉันจะเขียนได้อย่างไร' ฉันจะวางโค้ดบางส่วนที่อ้างถึง gamesaves จาก 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 พร้อมสิ่งที่จะบันทึกข้อมูลที่เกี่ยวข้องกับผู้ใช้ทั้งหมด (อาวุธใดที่คุณมีที่คุณอยู่ในระดับใด ฯลฯ )

และในที่สุดคุณก็มีไฟล์ที่โหลดข้อมูล savegame ในสถานการณ์เกมเนื้อหาที่ซับซ้อนที่สุดของทั้งหมดเพราะมันโหลดทุกอย่างอื่น อันนั้นเรียกว่า p_setup.c และตั้งอยู่ในไดเรกทอรีเดียวกัน

มันทำงานได้ดีสำหรับฉันสำหรับcatสิ่งเหล่านี้ทั้งหมดในบัฟเฟอร์ข้อความและpipeข้อความนั้นไปsendmailยังที่อยู่อีเมลของฉันเอง ด้วยวิธีนี้ฉันสามารถอ่านในช่วงเวลาแปลก ๆ ของวันและใช้ 'ค้นหา' เมื่อฉันต้องการค้นหาสิ่งต่าง ๆ เช่น 'DOOM โหลดเกมอย่างไร' รหัสมีความเห็นดี


3

คุณสามารถจัดลำดับคลาสหรือข้อมูลเป็นไฟล์แฟล็ตแล้วอ่านกลับเมื่อคุณโหลด


เนื่องจากไฟร์วอลล์ขององค์กรฉันไม่สามารถไปที่ลิงก์เหล่านั้นได้ ขอโทษ
sonicbhoc

4
หาก บริษัท ของคุณป้องกันไม่ให้คุณอ่านสิ่งที่คุณต้องการในการทำงานพวกเขาจะโง่ที่สุด
o0 '

2
นี่มันไม่ใช่งานของฉัน : P (และอาจจะ "องค์กร" ไม่ได้เป็นคำที่ดีที่สุด ... มันไฟร์วอลล์ที่โรงเรียนของฉัน)
sonicbhoc

-1

ฉัน +1: ed ข้อเสนอแนะเพื่อใช้ XML / JSON เพื่อจัดโครงสร้างเกมบันทึก วิธีนี้คุณพร้อมมากที่จะทำให้ "คลาวด์" ประหยัด หรืออย่างน้อยคุณจะมีโครงสร้างที่คุณสามารถใช้สำหรับโครงการในอนาคตซึ่งอาจเกี่ยวข้องกับเว็บ ตราบใดที่ไฟล์ไม่ได้ถูกจัดเก็บในแบบที่อ่านง่ายเกินไปพวกเขาก็ควรให้คุณได้รับประโยชน์มากมาย ชอบตัวชี้วัด! ไชโย


1
ที่เก็บข้อมูลบนคลาวด์หมายถึงคุณกำลังจัดเก็บบันทึกทางออนไลน์ คุณสามารถทำได้ด้วยรูปแบบไฟล์ใดก็ได้

ฉันรู้แล้ว. แต่เพื่อจุดประสงค์ในการสื่อสารคุณควรจัดโครงสร้างด้วยสิ่งที่ง่ายต่อการถ่ายโอน
ฟิล

หากเกมของคุณเข้ากันไม่ได้กับรูปแบบไฟล์บันทึกของตัวเองคุณจะพบปัญหาที่ใหญ่กว่า "ความสะดวกในการโอนย้าย"
Gurgadurgen

การบันทึก XML และ JSON นั้นง่ายต่อการแก้ไข (= cheat) ในฐานะนักพัฒนาคุณอาจจะใช่หรือไม่ก็ได้
ตรัง Oul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.