ゲームの保存/読み込みシステムを作成するにはどうすればよいですか?


17

C ++でゲームの保存/読み込みシステムを作成する方法を見つけようとしています。今のところ、私はそれをすべてバイナリフラグを使用して行っています。誰もそれを別の方法で行う方法の手がかりを手に入れましたか?バイナリを使用しても構いませんが、オプションを知りたいです。また、特定の事柄を決定するために、1つのイベントの完了または未完了のステータスを簡単に確認できるものが必要です(このゲームの多くのアイテムシステムは、プレイヤーが行ったことまたは行っていないことに依存しますゲームの全体を通して)。


1
実際、それを見た後、このプロジェクトのためにPythonを使い続ける方が良いかもしれません。ゲームエンジンとしてPanda3Dを使用していますが、Pythonバージョンはより洗練されています。それで、おそらくPythonでもっと速く開発できたでしょう。さらに、pythonにはpickleと呼ばれる組み込みのシリアル化クラスがあるため、コーディングの手間が省けます。
-sonicbhoc

回答:


5

シリアル化がその方法であり、ステータスチェックに関しては、シリアル化解除メソッドにロジックを持たせることができます。


私はここでそれについて読んでいます(parashift.com/c++-faq-lite/serialization.html)、それは非常に興味深いようです。シリアル化を実際に扱ったことがないので、これは私にとって良い学習体験になるでしょう。ありがとうございました!
-sonicbhoc

問題ありません!ゲームのシリアル化も(C#ではありますが)行っています。幸運を!
ThatsGobbles

4
留意してください:シリアル化する場合は、常にバージョン番号を最初に保存し、最初に読み直してください。この方法では、(一部の)下位互換性を提供することにより、savegame形式への重大な変更を適切に処理できます。
LearnCocos2D

4
開発時には、人間が読める形式でファイルを作成することも強くお勧めします。JSONやXMLのようなものかもしれません。必要なものがすべて保存されているかどうかを確認するのがはるかに簡単になり、既に書き込まれたファイルのデータを微調整するのもはるかに簡単になります(ファイルをディスクに書き込んだ後、テストまたは修正するため)。
bummzack

5

DOOMソースコードを少し勉強しました。そこでどのように行われるかを説明します。

D_DoomMainには、すべてのopen / save / load関数のほか、多数の機能が含まれています。ファイルの冒頭にあるように、

// 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の構成です。これは1つの巨大なループです(長さが1000〜2000行のようなものです)。

あなたの質問は「どうやって書くことができますか?」D_DoomMainから、gamesavesを参照するコードを貼り付けます。

ループの最後に、これらのものが使用されるステートメントを示します。

   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自分のメールアドレスへ。そうすれば、1日の奇妙な瞬間にそれを読み通すことができ、「DOOMはどのようにゲームをロードするか」のようなものを探したいときに「find」を使用できます。コードはよくコメントされています。


3

あなたは可能性があり、クラスシリアライズフラットファイルやデータを、その後、あなたがロードしたときに、それを読み戻します。


企業のファイアウォールにより、これらのリンクにアクセスできませんでした。ごめんなさい。
sonicbhoc

4
あなたの会社があなたが仕事をするために必要なものを読むことをあなたが妨げているなら、彼らはせいぜいばかです。
o0 '。

2
まあ、これはまだ私の仕事ではありません。:P(そしておそらく「企業」は最良の言葉ではなかった...それは私の学校のファイアウォールだ)
-sonicbhoc

-1

XML / JSONを使用してセーブゲームを構築するという提案を+1しました。これにより、セーブを「クラウド」ベースにする準備が非常に整います。または、少なくとも、Webが関係する可能性のある将来のプロジェクトに使用できる構造になります。ファイルが読みやすい方法で保存されていない限り、多くの利点があります。メトリックが好きです!やったー


1
クラウドストレージとは、セーブをオンラインで保存することを意味します。任意のファイル形式でこれを行うことができます。

そんなこと知ってる。ただし、通信を目的とする場合は、転送しやすいもので構成することをお勧めします。
フィル

ゲームが独自の保存ファイル形式と互換性がない場合、「転送のしやすさ」よりもはるかに大きな問題が発生しています。
Gurgadurgen

XMLとJSONの保存は、非常に簡単に改ざんできます(チート)。開発者として、あなたはそれで大丈夫かもしれませんし、そうでないかもしれません。
トランオウル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.