게임의 저장 /로드 시스템을 작성하려면 어떻게해야합니까?


17

C ++에서 내 게임의 저장 /로드 시스템을 작성하는 방법을 찾으려고합니다. 지금은 바이너리 플래그를 사용하여 모든 작업을 수행하고 있습니다. 다른 방법으로 단서가 있습니까? 바이너리를 사용하는 것은 마음에 들지 않지만 옵션을 알고 싶습니다. 또한 특정 일을 결정하기 위해 하나의 이벤트가 완료 또는 불완전한 상태를 쉽게 확인할 수있는 것을 원합니다 (이 게임의 많은 항목 시스템은 플레이어가 가지고 있거나하지 않은 것에 달려 있습니다 게임 내내).


1
실제로 그것을 본 후에는이 프로젝트에서 Python을 고수하는 것이 좋습니다. Panda3D를 게임 엔진으로 사용하고 있으며 파이썬 버전이 더 세련되었습니다. 그것은 파이썬에서 더 빨리 발전 할 수 있습니다. 또한 파이썬에는 pickle이라는 내장 직렬화 클래스가있어 코딩 문제를 줄일 수 있습니다.
sonicbhoc

답변:


5

직렬화가 진행되는 방식이며 상태 확인의 경우 직렬화 해제 방법에 논리를 사용할 수 있습니다.


여기 ( parashift.com/c++-faq-lite/serialization.html ) 에 대해 읽고 있는데 매우 흥미로워 보입니다. 나는 실제로 직렬화를 다루지 않았으므로 좋은 학습 경험이 될 것입니다. 감사합니다!
sonicbhoc

문제 없음! 내 게임의 직렬화 작업도하고 있습니다 (C #에도 불구하고). 행운을 빕니다!
ThatsGobbles

4
명심하십시오 : 직렬화하는 경우 항상 버전 번호를 먼저 저장하고 먼저 다시 읽으십시오. 그렇게하면 이전 버전과의 호환성을 제공하여 savegame 형식의 주요 변경 사항을 정상적으로 처리 할 수 ​​있습니다.
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_CheckParm처음부터 끝까지 s 로 가득 합니다. 이것이 D_DoomLoop의 구성입니다. 하나의 거대한 루프입니다 (1000-2000 줄 길이).

귀하의 질문은 '어떻게 쓸 수 있습니까?'입니다. 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라는 파일이 있으며 모든 사용자 관련 데이터 (어떤 무기를 가지고 있는지, 어느 레벨에 있는지 등)를 저장합니다.

마지막으로 저장 게임 데이터를 게임 시나리오에로드하는 파일이 있습니다. 그 이름은 p_setup.c이며 같은 디렉토리에 있습니다.

그것은 cat모두 텍스트 버퍼로, pipe그 텍스트 sendmail는 내 자신의 이메일 주소 로 잘 작동했습니다 . 그렇게하면 하루 중 이상한 순간에 그것을 읽을 수 있으며 'DOOM은 어떻게 게임을로드합니까?'와 같은 것을 찾고 싶을 때 '찾기'를 사용하십시오. 코드는 주석이 잘되어 있습니다.


3

당신은 할 수 클래스 직렬화 플랫 파일이나 데이터를 다음 이로드 할 때 다시 읽어 보시기 바랍니다.


회사 방화벽으로 인해 해당 링크에 접근 할 수 없었습니다. 죄송합니다.
sonicbhoc

4
회사에서 물건을 읽을 수없는 경우에는 일을해야합니다.
o0 '.

2
글쎄, 이것은 아직 내 직업이 아니다. : P (그리고 아마도 "기업"은 최고의 단어가 아니 었습니다 ... 그것은 우리 학교의 방화벽입니다)
sonicbhoc

-1

나는 +1 : XML / JSON을 사용하여 세이브 게임을 구성 할 것을 제안했다. 이렇게하면 "클라우드"기반으로 저장을 준비 할 수 있습니다. 또는 최소한 웹과 관련된 향후 프로젝트에 사용할 수있는 구조를 갖추어야합니다. 파일을 너무 쉽게 읽을 수있는 방법으로 저장하지 않으면 많은 이점을 얻을 수 있습니다. 메트릭스처럼! 후 레이


1
클라우드 스토리지는 온라인으로 저장을 저장한다는 의미입니다. 모든 파일 형식으로 수행 할 수 있습니다.

나도 알아 그러나 의사 소통을 위해 쉽게 전달할 수있는 구조로 작성하는 것이 좋습니다.
Phil

게임이 자체 저장 파일 형식과 호환되지 않는 경우 "전송 용이성"보다 더 큰 문제가 있습니다
Gurgadurgen

XML 및 JSON 저장은 (= 치트)를 조작하기가 매우 쉽습니다. 개발자로서, 당신은 그것에 좋을 수도 있고 그렇지 않을 수도 있습니다.
Trang Oul
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.