Làm cách nào tôi có thể viết hệ thống Lưu / Tải cho trò chơi của mình?


17

Tôi đang cố gắng tìm ra cách để viết một hệ thống lưu / tải cho trò chơi của mình trong C ++. Ngay bây giờ, tôi đang làm tất cả bằng cờ nhị phân. Bất cứ ai cũng có một manh mối về cách làm điều đó theo cách khác? Tôi không phiền khi sử dụng nhị phân, nhưng tôi muốn biết các lựa chọn của mình. Tôi cũng muốn một cái gì đó dễ dàng kiểm tra trạng thái của chỉ một sự kiện đang hoàn thành hoặc chưa hoàn thành để quyết định một số điều nhất định (rất nhiều hệ thống vật phẩm trong trò chơi này phụ thuộc vào những gì người chơi đã hoặc chưa làm trong suốt quá trình của trò chơi).


1
Trên thực tế, sau khi xem xét nó, có lẽ tốt hơn cho tôi để gắn bó với Python cho dự án này. Tôi đang sử dụng Panda3D làm công cụ trò chơi và phiên bản python được đánh bóng hơn. Điều đó, và tôi có thể có thể phát triển nhanh hơn trong python. Thêm vào đó, python có một lớp tuần tự hóa tích hợp được gọi là pickle, giúp tôi tránh được rắc rối khi mã hóa.
sonicbhoc

Câu trả lời:


5

Tuần tự hóa sẽ là cách để đi và đối với việc kiểm tra trạng thái, bạn có thể có logic trong phương pháp khử lưu huỳnh để làm như vậy.


Tôi đang đọc về nó ở đây ( parashift.com/c++-faq-lite/serialization.html ) và nó có vẻ rất thú vị. Tôi chưa bao giờ thực sự giải quyết việc xê-ri hóa, vì vậy đó sẽ là một trải nghiệm học tập tốt cho tôi. Cảm ơn bạn!
sonicbhoc

Không thành vẫn đề! Tôi cũng đang làm việc với việc tuần tự hóa (mặc dù trong C #) cho trò chơi của mình. Chúc may mắn!
ThatsGobble

4
Hãy ghi nhớ: nếu bạn tuần tự hóa luôn lưu trữ số phiên bản trước và đọc lại số đó trước. Bằng cách đó, bạn có thể xử lý các thay đổi phá vỡ định dạng lưu trữ một cách duyên dáng bằng cách cung cấp (một số) khả năng tương thích ngược.
LearnCocos2D

4
Trong quá trình phát triển, tôi cũng khuyến khích bạn viết các tệp thành định dạng có thể đọc được. Có lẽ một cái gì đó như JSON hoặc XML. Dễ dàng hơn nhiều để xem liệu mọi thứ bạn cần đã được lưu và cũng dễ dàng hơn để điều chỉnh dữ liệu trong một tệp đã được ghi (để kiểm tra hoặc sửa lỗi sau khi ghi tệp vào đĩa).
bummzack

5

Tôi đã nghiên cứu mã nguồn DOOM một chút. Tôi sẽ cho bạn biết làm thế nào nó được thực hiện trong đó.

D_DoomMain chứa tất cả các hàm mở / lưu / tải, cũng như một loạt các thứ khác. Như nó nói ở đầu tập tin,

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

Về cơ bản, toàn bộ tập tin có đầy đủ M_CheckParmtừ đầu đến cuối. Đó là những gì D_DoomLoop bao gồm. Đó là một vòng lặp lớn (dài khoảng 1000-2000 dòng).

Vì câu hỏi của bạn là 'Làm thế nào tôi có thể viết?' Tôi sẽ dán một số đoạn mã đề cập đến các trò chơi, từ D_DoomMain:

đây là những câu lệnh mà công cụ đó được sử dụng, ở cuối vòng lặp.

   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

Đây là chức năng truy cập các chuỗi mà bạn tìm thấy nằm rải rác trong mã:

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

Bạn cũng đã có một tệp có tên p_savegame.c với nội dung sẽ lưu tất cả dữ liệu liên quan đến người dùng (loại vũ khí bạn có, bạn đang ở cấp độ nào, v.v.).

Và cuối cùng, bạn đã có được tệp tải dữ liệu lưu vào một kịch bản trò chơi, được cho là phức tạp nhất trong tất cả, bởi vì nó cũng tải mọi thứ khác. Cái đó được gọi là p_setup.c, và nằm trong cùng thư mục.

Nó hoạt động tốt cho tôi cattất cả những thứ này vào một bộ đệm văn bản và pipevăn bản đó đến sendmailđịa chỉ email của riêng tôi. Bằng cách đó, tôi có thể đọc qua nó vào những thời điểm kỳ lạ trong ngày và sử dụng 'find' khi tôi muốn tìm kiếm những thứ như 'làm thế nào để DOOM tải một trò chơi'. Các mã được bình luận tốt.


3

Bạn có thể tuần tự hóa lớp hoặc dữ liệu thành một tệp phẳng và sau đó đọc lại khi bạn tải.


Do tường lửa của công ty, tôi không thể truy cập các liên kết đó. Lấy làm tiếc.
sonicbhoc

4
Nếu công ty của bạn ngăn cản bạn đọc những thứ bạn cần để làm việc thì họ là những kẻ ngốc tốt nhất.
o0 '.

2
Chà, đây chưa phải là công việc của tôi. : P (và có lẽ "tập đoàn" không phải là từ tốt nhất ... đó là tường lửa ở trường tôi)
sonicbhoc

-1

Tôi +1: ed đề xuất sử dụng XML / JSON để cấu trúc các trò chơi lưu. Bằng cách này, bạn đã sẵn sàng để thực hiện tiết kiệm dựa trên "đám mây". Hoặc ít nhất, bạn sẽ có một cấu trúc bạn có thể sử dụng cho các dự án trong tương lai có thể liên quan đến web. Miễn là các tệp không được lưu trữ theo cách quá dễ đọc, chúng sẽ mang lại cho bạn vô số lợi ích. Giống như số liệu! hoan hô


1
Lưu trữ đám mây chỉ có nghĩa là bạn đang lưu trữ tiết kiệm trực tuyến. Bạn có thể làm điều đó với bất kỳ định dạng tập tin.

Tôi biết điều đó. Nhưng với mục đích giao tiếp, có thể là một ý tưởng tốt để cấu trúc nó với thứ gì đó dễ chuyển.
Phil

Nếu trò chơi của bạn không tương thích với định dạng tệp lưu riêng của nó, bạn đã gặp vấn đề lớn hơn nhiều so với "dễ chuyển"
Gurgadurgen

Việc lưu XML và JSON sẽ rất dễ bị giả mạo (= cheat). Là một nhà phát triển, bạn có thể hoặc không thể ổn với điều đó.
Trang Oul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.