C ++でゲームの保存/読み込みシステムを作成する方法を見つけようとしています。今のところ、私はそれをすべてバイナリフラグを使用して行っています。誰もそれを別の方法で行う方法の手がかりを手に入れましたか?バイナリを使用しても構いませんが、オプションを知りたいです。また、特定の事柄を決定するために、1つのイベントの完了または未完了のステータスを簡単に確認できるものが必要です(このゲームの多くのアイテムシステムは、プレイヤーが行ったことまたは行っていないことに依存しますゲームの全体を通して)。
C ++でゲームの保存/読み込みシステムを作成する方法を見つけようとしています。今のところ、私はそれをすべてバイナリフラグを使用して行っています。誰もそれを別の方法で行う方法の手がかりを手に入れましたか?バイナリを使用しても構いませんが、オプションを知りたいです。また、特定の事柄を決定するために、1つのイベントの完了または未完了のステータスを簡単に確認できるものが必要です(このゲームの多くのアイテムシステムは、プレイヤーが行ったことまたは行っていないことに依存しますゲームの全体を通して)。
回答:
シリアル化がその方法であり、ステータスチェックに関しては、シリアル化解除メソッドにロジックを持たせることができます。
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」を使用できます。コードはよくコメントされています。
あなたは可能性があり、クラスシリアライズフラットファイルやデータを、その後、あなたがロードしたときに、それを読み戻します。
XML / JSONを使用してセーブゲームを構築するという提案を+1しました。これにより、セーブを「クラウド」ベースにする準備が非常に整います。または、少なくとも、Webが関係する可能性のある将来のプロジェクトに使用できる構造になります。ファイルが読みやすい方法で保存されていない限り、多くの利点があります。メトリックが好きです!やったー