ページ 11

セーブデータの作り方

Posted: 2013年1月08日(火) 20:20
by ぽち
こんばんは。

softyaさんの講座を元にしています。
http://dixq.net/forum/blog.php?u=114&sd=a&c=2&start=50

前回、セーブ・ロードの前段階まで進めることができました。
http://dixq.net/forum/viewtopic.php?f=3&t=12087

そこで、実際にセーブ(書き込み)の機能を実装しようと思い、
a.datファイルをバイナリエディタで確認してみたところ、数値が違うものでした。

menu.cpp

コード:

static int save(PlayerParam_t *playerParam)
{
	FILE *fp;
	if((fp = fopen("a.dat", "wb")) == NULL)
		return 0;

	fwrite( &playerParam, sizeof(playerParam), 1, fp ) ;    
	
	fclose(fp);
	return 1;
}
1つずつやってみようと思い、下記を作ってみたところ、
ちゃんと上がったレベルが入っていました。

コード:

static int save(PlayerParam_t *playerParam)
{
	PlayerParam_t test = { playerParam->level };

	FILE *fp;
	if((fp = fopen("a.dat", "wb")) == NULL)
		return 0;

	fwrite( &test, sizeof(test), 1, fp ) ;    
	
	fclose(fp);
	return 1;
}
まず、まとめて書き込む場合、何がいけないのでしょう。


それと、つづきからを選択した場合のロード(読み込み)も考えてみたのですが、
ゲームの方に反映されていませんでした。

main.cpp

コード:

static int menu_save(PlayerParam_t *playerParam)
{
	PlayerParam_t test = { };

	FILE *fp;
	if((fp = fopen("a.dat", "rb")) == NULL)
		return 0;
 
	fread( &test, sizeof(test), 1, fp);
	
	fclose(fp);
	return 1;
}
どこがいけないのでしょうか。
ご指導くださると助かります。よろしくお願いします。

Re: セーブデータの作り方

Posted: 2013年1月08日(火) 20:31
by h2so5
まず上の書き込みについてですが、

コード:

    fwrite( &playerParam, sizeof(playerParam), 1, fp ) ;    
これだとplayerParamそのものを書きこんでしまっています。
playerParamはポインタですからデータ本体ではありません。

正しくはこうなります

コード:

    fwrite( playerParam, sizeof(PlayerParam_t), 1, fp ) ;    
次に読み込みについてですが、testというローカル変数に書きこんでしまっては意味がありません。
読み込み先にしたいのは引数にあるplayerParamですよね?