ページ 11

マップエディターQuoyle08の.map読み込み

Posted: 2009年10月13日(火) 18:33
by yskey
どうもお世話になっていますm(_ _)m
現在DxLibで、戦術級シュミレーションゲームを制作中です。
マップ制作にQuoyle08を使用させてもらっているのですが、出てくるマップデータファイルの読み込みに戸惑っています。
.map形式のファイルを使い、二次元配列に数値を読み込んでいくのですが、ちゃんと読み込むことができません。
マップチップは4枚なのに二次元配列に読み込んで、確認のためにDrawFormatString関数で出力すると771や-1などおかしい数値が入ってしまいます。
http://inu.harisen.jp/index.html
のサイト様を参考にさせてもらっているのですが、この関数では無理でしょうか?
添付されているファイルに問題があるのでしょうか?
Quoyle08でデータを生成するときに間違っているのでしょうか?
--------------------------------構造体Mapの中身
struct Map{
  int chip[CHIP];  //チップ画像のハンドル
  int chip_num;  //読み込んだチップの枚数

  int data[LYE[/url][27][27];	//マップデータ レイヤーn枚分 64x64
  int data_x_num;		//マップデータのチップ枚数X
  int data_y_num;		//マップデータのチップ枚数Y
};
--------------------------------
int LoadMapData(const char *name)
{
	int fh = 0;
	int buf[2] = {NULL};
	
	fh=FileRead_open(name);

	for(int i=0;i<2;i++)FileRead_read(&buf, sizeof(BYTE), fh);
	map.data_x_num=((buf[1] & 0xff) << 8) | (buf[0] & 0xff);
	
	for(int k=0;k<2;k++)FileRead_read(&buf[k], sizeof(BYTE), fh);
	map.data_y_num=((buf[1] & 0xff) << 8) | (buf[0] & 0xff);

	FileRead_seek(fh,16,SEEK_SET);

	for(int q=0;q<LYER;q++){
		for(int y=0;y<map.data_y_num;y++){
			for(int x=0;x<map.data_x_num;x++){
				for(int m=0;m<2;m++){
					buf[m]=FileRead_getc(fh);
				}
				map.data[q][y][x]=buf[0]|(buf[1]<<8);
			}
		}
	}

	FileRead_close(fh);
	return 0;
}

Re:マップエディターQuoyle08の.map読み込み

Posted: 2009年10月13日(火) 21:24
by Justy
 なんというか。

 ツールから出力される mapファイルは
[color=#d0d0ff" face="monospace]
+ 0x00 2byte 横サイズ
+ 0x02 2byte 縦サイズ
+ 0x04 2byte チップ横サイズ
+ 0x06 2byte チップ縦サイズ
+ 0x08 1byte レイヤー数
+ 0x09 1byte マップチップ数上限フラグ
+ 0x10 Xbyte データ
[/color]

というフォーマットなのですが、このサイト上にあるコードは
[color=#d0d0ff" face="monospace]
ttp://inu.harisen.jp/scene_1/14.html
+ 0x00 2byte 横サイズ
+ 0x02 2byte 縦サイズ
+ 0x04 20byte ?
+ 0x18 Xbyte データ
[/color]


[color=#d0d0ff" face="monospace]
ttp://inu.harisen.jp/scene_1/17.html
+ 0x00 2byte 横サイズ
+ 0x02 2byte 縦サイズ
+ 0x04 16byte ?
+ 0x14 Xbyte データ
[/color]

の2種類あります。

 データの位置が途中で変わっているにもかかわらず、ツールから出力されるデータとは
どちらも一致しない……。

 う~ん、ツール側のフォーマットが変わったりしたんでしょうか……。



>添付されているファイルに問題があるのでしょうか

 ファイルサイズ的には大丈夫そうです。


>この関数では無理でしょうか

 目視で見る限り、だめですね。
 といっても何カ所か変えるだけで動くとは思いますが。

・ シーク量 (FileRead_seek) が違う
 そのマップの縦横サイズを取得した後、16バイト移動していますが、
マップデータの先頭は 16バイト後ろではありません。

・ マップチップ数上限を確認してください
 マップデータの読み取りに2バイト読み取ってはシフトして数値を組み立てていますが、
それは「マップチップ数上限」が2バイト(最大65536個)だったときの話です。

 添付されたマップデータは1バイト(最大256個)のものなので、
2バイト読み取ってはシフトする必要はありません。

 きちんと上限が1バイトなのか2バイトなのか読み取って処理をわけてください。
(最悪決め打ちで1バイトとしてしまってもいいかもしれませんが、
その場合2バイトのデータが読み込まれたらエラーにした方がいいでしょう)

・ LYERは決め打ちしないで正しくファイルから読み取ってください
 ファイルフォーマットはツールのマニュアルにも書いてありますし、
簡易なのは上にも書いてあるので、正しくレイヤー数はファイルの数値を使ってください。

Re:マップエディターQuoyle08の.map読み込み

Posted: 2009年10月13日(火) 22:58
by yskey
>>Justyさん
ややこしい話にもかかわらず大変ご丁寧な返信ありがとうございます。
「最大65536個に設定してチップの情報量が2バイト分になる」ということが理解できていませんでした。

「シーク量 (FileRead_seek) が違う」というのは
最大65536個設定にするとマップデータ位置は最初から16バイト目
では、256個なら8バイト目ということですね。

汎用性を高めるためにLYERもちゃんと読み込みたいと思います。

自分で悩んでいてもずっと解決してませんでした。
どうもありがとうございました。m(_ _)m

Re:マップエディターQuoyle08の.map読み込み

Posted: 2009年10月13日(火) 23:14
by Justy

>256個なら8バイト目ということですね

 いえ違います。
 それはマップデータの1つあたりの情報量です。

 「マップチップ数上限」が1バイトだろうが2バイトだろうが、
マップデータの先頭はファイルの先頭から 0x10バイト目で固定なんですよ。

 最初に縦横サイズ読み込んでいるので、既に4バイト分進んでいることになります。
 結果、0x10-4で、0xcバイト分後ろにシークするとそこがマップデータの先頭になります。

 ただ上の助言通りやると、今までは読み飛ばしていましたが
レイヤー数だったりマップチップ数上限を読み込むことになるので、
シーク量も変わってきます。