ページ 11

マップデータをバイナリ保存したあとにマップサイズなどを変えたい

Posted: 2013年11月11日(月) 20:46
by chalaza
アクションゲームのマップを作っていて、「マップデータ数値」、「マップの高さ」「マップの横幅」をバイナリ形式で保存できるようにしました。
for文でマップの最大数の分だけ繰り返してその3種類のデータを1つのバイナリファイルに保存します。
要するにバイナリデータに「マップ1数値」→「マップ1高さ」→「マップ1横幅」→「マップ2数値」→「マップ2高さ」…と保存しているのです。
読み込むときも全く同じで、マップ1数値から読み込んでいきます。

そこで、一度バイナリファイルにマップのデータを保存した後に、例えばステージ2の高さを変えて、マップデータを読み込もうとすると停止したり、
他のマップが崩れたりしてしまいます。
このように、一度データを保存した後に、マップの高さや横幅を変えても、他のマップに影響しないようにするにはどうすれば良いでしょうか?

MapdataSelectがマップの数だけある構造体配列です。MapMAXはマップの最大数でる。

コード:

//ファイルを出力
	if(EditMode == 1 && Keyboard_Get( KEY_INPUT_P ) == 1){
		FILE *fp = fopen( "MapData.dat", "wb" );
		for(int i = 0; i < MapMAX; i++)
		{
			fwrite(  MapdataSelect[i].Map, sizeof( MapdataSelect[i].Map),  MapdataSelect[i].Width* MapdataSelect[i].Height, fp ); //出力
			fwrite( & MapdataSelect[i].Width, sizeof( MapdataSelect[i].Width), 1, fp ); //出力
			fwrite( & MapdataSelect[i].Height, sizeof( MapdataSelect[i].Height), 1, fp ); //出力
		}
		fclose( fp );//ファイルを閉じる

		PlaySoundMem( EditExportSE, DX_PLAYTYPE_BACK ); // 効果音を再生する
		Map_Update( Player );//マップ更新
	}
	//取り込み
	if(EditMode == 1 && Keyboard_Get( KEY_INPUT_O ) == 1){
		FILE *fp = fopen( "MapData.dat", "rb" );
		for(int i = 0; i < MapMAX; i++)
		{
			fread( MapdataSelect[i].Map, sizeof(MapdataSelect[i].Map), MapdataSelect[i].Width*MapdataSelect[i].Height, fp );
			fread( &MapdataSelect[i].Width, sizeof(MapdataSelect[i].Width), 1, fp );
			fread( &MapdataSelect[i].Height, sizeof(MapdataSelect[i].Height), 1, fp );
		}
		fclose( fp );

		PlaySoundMem( EditImportSE, DX_PLAYTYPE_BACK ); // 効果音を再生する
		Map_Update( Player );//マップ更新
	}

Re: マップデータをバイナリ保存したあとにマップサイズなどを変えたい

Posted: 2013年11月11日(月) 20:56
by h2so5
マップ横幅と縦幅を読み込む前にマップデータを読み込んでいるのが問題なのでは?
先に横幅と縦幅が分かっていないと読み込むべきサイズが分からないと思うのですが。

Re: マップデータをバイナリ保存したあとにマップサイズなどを変えたい

Posted: 2013年11月11日(月) 20:58
by softya(ソフト屋)
読み込むときにファイルに書き出しているマップの高さを使っていないからでは無いですか?
つまり、ファイルに書き込む順番を変えれば解決しませんか?

「マップ1高さ」→「マップ1横幅」→「マップ1数値」

Re: マップデータをバイナリ保存したあとにマップサイズなどを変えたい

Posted: 2013年11月11日(月) 22:03
by chalaza
ありがとうございます。一応停止しないようにはなりました。
でも無理やりマップの高さなどを変えると崩れてしまうのは仕方ないようなので
マップエディタの方に高さを変えられる設定をつけてみます。
解決です。