Platinumでマップ表示

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
楽しいC

Platinumでマップ表示

#1

投稿記事 by 楽しいC » 12年前

Platinumというソフトを使って、マップを作りました。
しかし、C言語で実現する仕方がわかりません。
調べてみても、あたり判定は0と1で表すみたいなことしか書いて無く、具体的な作り方が書いてません・・。
理論はわかるのですが、どう表せばいいのか全くわかりません・・・・。

一応理解しているのは
マップチップに一つ一つに番号を付けて、マップデータを作成し、それをもとにプログラムするということです。

わからない点は
マップチップに番号を付ける方法と、マップデータを作る方法がわかりません・・・。正確には、platinumでは様々な形式で出力できるのですが(fmf、csv、ppjなど)どの形式で
出力すればいいのかわかりません。

また、マップのあたり判定などのデータ?レイヤー?(0,0,1,0,0,など)の作り方もわかりません・・・。

自分でもよくわからなく、質問の内容があいまいになっているかもしれませんが、よろしくお願いします。

nil
記事: 428
登録日時: 12年前

Re: Platinumでマップ表示

#2

投稿記事 by nil » 12年前

ではまず、レイヤーはなし、サイズは20*15などで固定、ファイルからは情報を読み込まない
という条件でマップを表示することはできますか?

楽しいC

Re: Platinumでマップ表示

#3

投稿記事 by 楽しいC » 12年前

画像だけ表示するということですか?

drawgraphを使って表示することができました。

nil
記事: 428
登録日時: 12年前

Re: Platinumでマップ表示

#4

投稿記事 by nil » 12年前

では次にファイルからの読み込みを……
バイナリファイルの読み書きがわかるのであればfmfを、そうでなければcsvを使うことをオススメします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#5

投稿記事 by softya(ソフト屋) » 12年前

とりあえずcsvで出力してどんな風に情報が並んでいるか確認してみてください。
当たり判定レーヤーはレイヤーの追加をすることで作ることができます。
レイヤーの意味を決めるのは実行するプログラム側の役割ですので、Platinumは役割を特に決めてレイヤーを作れるわけではありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#6

投稿記事 by 楽しいC » 12年前

softya様、涼雅様ご返信ありがとうございます。

csvを読み込んで、DrawFormatString(0,0,"%s",file_csv) のように表示させたところ、255,255,54,255,255などがが文字列として(?)横に羅列されるだけでした。

これを数値にして、255だったら1番のチップを54だったら2番のチップをのように・・・?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#7

投稿記事 by softya(ソフト屋) » 12年前

マップ画像パーツ番号の数え方は横に16個x縦に16個で合計256個。左上は0番で右に行くと1、2、3と番号が増えていって下に下がると+16づつ増えます。
255だとパーツが未選択で255番目(最後)のマップ画像パーツと言うことで横:15で縦:15の位置のマップ画像パーツを表しています。
54だったら54番目のマップ画像パーツで、横:6で縦:3の位置のマップ画像パーツということです。
※ すべての数値は0から始まりますので要注意。

【補足】
csvは数値をカンマ区切りで文字列化したテキストファイルですので文字が並ぶのは当然です。
並んでいるのはマップ画像パーツの番号です。
配列の内容をそのままテキスト表示したのと同じだと思ってもらえばよいでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 12年前
住所: 埼玉
連絡を取る:

Re: Platinumでマップ表示

#8

投稿記事 by beatle » 12年前

CSVは Camma Separated Values の略でして、カンマ「,」で値が区切られています。
CSVファイルの読み込みについてはウェブ上にいろいろ参考になるページがありますね。
C言語 CSVファイルの読み込み
fscanfを使わずとも、文字列として読み込み strtol などを使って自前で変換することもできます。

楽しいC

Re: Platinumでマップ表示

#9

投稿記事 by 楽しいC » 12年前

返信ありがとうございます。

csvでうまく表示されてると思ったら表示できてませんでした・・・。

コード:

//データを初期化する関数
void Map_Initialize( MapData *MapData_s ){	

	if( (MapData_s->fp = fopen("media\\test.csv","r")) == NULL){//マップファイルを開く
		MessageBox( NULL, "ファイルが存在しないか、壊れています。", "open file error!! ", MB_OK);
		exit(1);
	}
	fgets(MapData_s->data, 375, MapData_s->fp);//マップファイルを読み込む
}

//マップを表示する
void Map_Draw(MapData *MapData_s){	

	DrawFormatString(0,30,GetColor(255,255,255),"%s",MapData_s->data);//内容を表示

}
これで実行すると確かに255,255,255と表示されるのですが、途中まで(1行)までしか読み込めません・・。
whileで読み込もうとすると内容が毎回書き換えられてしまって、最後の1行しか読み込むことができません。
2次元配列にしても、やりかたがよくわからず、変なエラーが出てきてしまいます。
どうやって表示させればいいのでしょうか・・?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#10

投稿記事 by softya(ソフト屋) » 12年前

fgetsは一行しか読まないので、whileループするしかありません。
そして、MapData_sは文字列の配列ではないので文字列の配列にしないと行けません。つまりcharの2次元配列です。
その問題のあるコードを貼ってもらったほうが良かったですね。
結構呼び出し方と配列の宣言の部分も重要です。

あとbeatleさんが提案されてますが最終的に文字列データのままではマップ表示に使えないので数値に変換する必要があります。
なので、この関数処理で文字列読み込み→マップの数値配列までやるべきだと思います。
その場合は Map_Initializeの引数は2次元の数値(int型)配列です。

ところで、MapData_sの_sってなんでしょう?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#11

投稿記事 by 楽しいC » 12年前

ご回答ありがとうございます。

皆様のおかげでなんとか2次元配列を使って文字列を格納することはできたのですが、それを数値化するのがいまいちわかりません・・・。
strtolは、行単位で変換できない・・?だとすると、先頭から一つずつ変換するしかないのでしょうか?

MapData_s->img_int[j][0] = strtol(MapData_s->img[j], &endptr, 10); と書いた場合、 MapData_s->img[j]に格納されている文字列を、10進数でMapData_s->img_int[j][0]に格納
という意味ですよね?なのに全部の文字列を変換できないので、[0]のように一つの配列しか指定できません。
うまく言葉で表せず、説明がおかしなところがあるかもしれませんが、よろしくお願いします・・。

//ヘッダ

コード:

マップデータ
struct MapData{
	char img[15][375];	//文字列データ
	int  img_int[15][20];   //数値データ
	char data[375];      //マップデータ
	int img_flag;		//画像があるかどうか
	FILE *fp;                     //csvファイル読込
};
マップ関数(初期化)

コード:

void Map_Initialize( MapData *MapData_s ){	

	int j=0;         //縦(?)
	char *endptr;//変換不可能な文字列を格納
	
	if( (MapData_s->fp = fopen("media\\test.csv","r")) == NULL){//ファイルを開く
		MessageBox( NULL, "ファイルが存在しないか、壊れています。", "open file error!! ", MB_OK);
		exit(1);
	}
	while( fgets(MapData_s->data, 375, MapData_s->fp) !=NULL ){//データがなくなるまで行単位で読込
		
		for(int i=0; i< 370 ; i++){//文字列を2次元配列に格納
			MapData_s->img[j][i] = MapData_s->data[i];//ここではまだ文字列
		}
		MapData_s->img_int[j][0] = strtol(MapData_s->img[j], &endptr, 10);//←ここで変換([j][0]じゃないとエラーがでる。恐らく、先頭の数値(255だけ)しか変換できないから?)
	j++;//次の行
	}
}
これで実行すると、当たり前ですが、 MapData_s->img[0][0] = 255    MapData_s->img[1][0] = 255  のように表示され、 MapData_s->img[0][2]だと、 = 0 と表示されます。
どうやって、行単位で変換するのでしょうか?

>>ところで、MapData_sの_sってなんでしょう?
_sは struct の略で構造体で、_eが列挙体のように区別しようとしたんですが、不要ですかね・・?

C言語の書き方とかよくわからずほかにもおかしなところがあって読みにくいかもしれません・・・。
その時は指摘してもらえると、うれしいです!

楽しいC

Re: Platinumでマップ表示

#12

投稿記事 by 楽しいC » 12年前

補足:マジックナンバーがたくさんありますが、一度マップの表示を覚えてから、修正していくので、問題ないです!

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#13

投稿記事 by softya(ソフト屋) » 12年前

楽しいC さんが書きました:ご回答ありがとうございます。
皆様のおかげでなんとか2次元配列を使って文字列を格納することはできたのですが、それを数値化するのがいまいちわかりません・・・。
strtolは、行単位で変換できない・・?だとすると、先頭から一つずつ変換するしかないのでしょうか?

MapData_s->img_int[j][0] = strtol(MapData_s->img[j], &endptr, 10); と書いた場合、 MapData_s->img[j]に格納されている文字列を、10進数でMapData_s->img_int[j][0]に格納
という意味ですよね?なのに全部の文字列を変換できないので、[0]のように一つの配列しか指定できません。
うまく言葉で表せず、説明がおかしなところがあるかもしれませんが、よろしくお願いします・・。
,で区切るの方法の一つにはfscanfを使う方法があります。beatleさんがサイトを紹介していますよね。
これだとfgetsするバッファも必要としません。

strtolを使う場合は1行だけのバッファを必要としますが、持ち帰る必要はないのでローカル変数として宣言できます。
私はstrtol派では無いですがendptrに,の位置が入ると思うので2回めは
strtol(endptr+1, &endptr, 10); 
ってやったらできませんかね?

私の方法strtokとatoiを使います。
楽しいC さんが書きました: これで実行すると、当たり前ですが、 MapData_s->img[0][0] = 255    MapData_s->img[1][0] = 255  のように表示され、 MapData_s->img[0][2]だと、 = 0 と表示されます。
どうやって、行単位で変換するのでしょうか?
列分のループも必要ですね。
楽しいC さんが書きました: >>ところで、MapData_sの_sってなんでしょう?
_sは struct の略で構造体で、_eが列挙体のように区別しようとしたんですが、不要ですかね・・?
型の宣言では工夫して_tや_eは区別のために使う時がありますが実は完全に一般的な方法では無いのです。
_sとなるとstructとstaticの両方の意味が推測されるので良くないのと変数名自体にstructは意識させなくて良いと思います。なので_sは不要です。
取り扱いを間違えたらエラーになりますから。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#14

投稿記事 by 楽しいC » 12年前

ご回答ありがとうございます。

なんとかマップの画像を表示させるところまでできました!
そこまではよかったのですが、表示させてみると、実際作ったマップとはまるで違っていて、崩れてしまっています・・・。

処理は、マップチップの大きさが32なので、+32しています。

コード:

void Map_Initialize( MapData *MapData_s ){	

	int j=0;
	char *endptr;//数値じゃ表現できない文字が格納
	
	if( (MapData_s->fp = fopen("media\\test.csv","r")) == NULL){//ファイルを開く
		MessageBox( NULL, "ファイルが存在しないか、壊れています。", "open file error!! ", MB_OK);//エラー
		exit(1);
	}
 
	while( fgets(MapData_s->data, 375, MapData_s->fp) !=NULL ){//ファイルを読み込み
		
		for(int i=0; i< 370 ; i++){//読み込んだファイルを2次元配列に
			MapData_s->img[j][i] = MapData_s->data[i];
		}

		for( int o=0 ; o < 20 ; o++ ){//2次元配列をの中身を int型の整数に変換
			if( o>0 ){MapData_s->img_int[j][o] = strtol( endptr+1, &endptr, 10);}
			else
				MapData_s->img_int[j][o] = strtol(MapData_s->img[j], &endptr, 10);
		}
	
	j++;
	}
	LoadDivGraph( "media\\MapChip.jpg", 18, 6, 3, 32, 32, MapData_s->chip );//マップチップ画像読み込み

}
マップ表示

コード:

void Map_Draw(MapData *MapData_s){	

	int k=32;//チップの大きさ
	for( int i=0 ; i<15 ; i++ ){//縦
		for( int j=0 ; j<20 ; j++ ){//横
			if( MapData_s->img_int[i][j] == 1 ){//もしも、マップデータが1なら
				DrawGraph( i+k, j+k,MapData_s->chip[MapData_s->img_int[i][j]], TRUE );//一番目のマップチップを表示
				k= k+32;//次のマップチップより32先に表示
			}
		}
	}
}
これで実行すると、1番のマップチップが、ななめにどんどん表示させられていきます。(+32してるから当たり前?)
それに、
if( MapData_s->img_int[j] == 1 ){
とやると、 2番目のマップチップだったら
if( MapData_s->img_int[j] == 2 ){
のようにしなければならず、かなりの数になってしまいます。

どうすれば、定位置にマップチップ画像に対応したマップチップを表示できるでしょうか?

また、 MapData_s に関して、アドバイスありがとうございます!
たしかに、struct とstatic も 頭文字がsで同じで間違いを引き起こすかもしれないですね・・・。
構造体は、 _sともしなくても、 構造体の中身に入れるかどうかでわかりますよね。
今は、直すのがめんどくさいので、マップ処理が解決したらプレイヤーとマップのほうも直したいと思います!

質問が、長引いてしまって申し訳ございません・・・。
今まで、シューティングなども作ってきましたが、マップ処理が一番難しくてどう処理すればいいのか全然思いつきません・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#15

投稿記事 by softya(ソフト屋) » 12年前

MapData_s->img[j] のi,jは、それぞれx,y座標を表します。
なので素直にx,yと言う変数名で処理したほうが良いと思います。
マップパーツは32x32ピクセルのチップですのでマップ座標を32倍すれば表示する画像座標です。+kではありません。

あとMapData_s->img[j]はマップチップの番号を示すのでMapData_s->chip[]の添字にしてください。
int mapchip_no = MapData_s->img[j];
上と合わせると
DrawGraph( x*32, y*32, MapData_s->chip[mapchip_no], TRUE );
となります。
これに
if( MapData_s->img_int[j] == 1 ){//もしも、マップデータが1なら
なんてif文は必要ありません。

と言いたい所ですがマップチップが16x16パーツじゃなくて6x3パーツみたいなので番号の変換が必要だと思います。
ここはPlatinumの気の利かない所です。
変換式は、
int px = mapchip_no % 16;
int py = mapchip_no / 16;
mapchip_no = py * 6 + px;
一度16x16パーツのx,yに分解して6x3用のパーツの並びに合わせてパーツ番号を変換しています。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#16

投稿記事 by 楽しいC » 12年前

ご回答ありがとうございます。

たしかに、変数はxとyの
ほうがいいですね。ありがとうございます!

しかし、if( MapData_s->img_int[y][x] == 1 ){これが抜けると、アクセス違反のエラーが出てしまいます。
いろいろ調べてみたところ、
DrawGraph( x*32, y*32,MapData_s->chip[Mapchip_No], TRUE );の部分の Mapchip_No で違反が起きています。

前後のコード

コード:

for( int y=0 ; y<15 ; y++ ){//配列y
		for( int x=0 ; x<20 ; x++ ){//配列x
			int Mapchip_No = MapData_s->img_int[y][x];
			int px = Mapchip_No % 16;
			int py =Mapchip_No / 16;
				Mapchip_No = py * 6 + px;
				//if( MapData_s->img_int[y][x] == 1 ){//もしも、マップデータが1なら
				DrawGraph( x*32, y*32,MapData_s->chip[Mapchip_No], TRUE );//ここで違反 Mapchip_No を 1にすると正常に起動する(全部1番目のチップで埋まるけど・・・。)
			//}
		}
	}

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#17

投稿記事 by softya(ソフト屋) » 12年前

あっとMapchip_Noが255番のチップは非表示なので変換前にif文で弾いたい方が良いでしょう。
ただ、そこはマップは表示されず背景のままですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#18

投稿記事 by 楽しいC » 12年前

うーん・・なかなかうまくいきません・・。

コード:

	for( int y=0 ; y<15 ; y++ ){
		for( int x=0 ; x<20 ; x++ ){
			if( MapData_s->img_int[y][x] != 255 ){//もしも、マップ番号が255以外なら
			int Mapchip_No = MapData_s->img_int[y][x];
			int px = Mapchip_No % 16;
			int py = Mapchip_No / 16;
				Mapchip_No = py * 6 + px;
				
				DrawGraph( x*32, y*32,MapData_s->chip[Mapchip_No], TRUE );//描画
			}
		}
	}
これで実行しても、先ほどと同じようなエラーが表示されます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#19

投稿記事 by softya(ソフト屋) » 12年前

変換後のMapchip_NoがMapData_s->chipの配列の添字範囲内にあることを確認してください。
外れたらprintfDX()でエラーレポートしましょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#20

投稿記事 by 楽しいC » 12年前

ご回答ありがとうございます。

すみません。投げやりな感じの質問になってしまいました。

デバッグしてみると、 Mapchip_No の中身が、変な数字になってしまっています。 (5429487272みたいな)

なぜ変わっているのか、追跡してみましたところ

マップデータを初期化する関数

コード:


while( fgets(MapData_s->data, 375, MapData_s->fp) !=NULL ){//マップデータがなくなるまで探す
		
		for(int i=0; i< 370 ; i++){//文字列を二次元配列にする
			MapData_s->img[j][i] = MapData_s->data[i];
		}

		for( int o=0 ; o < 20 ; o++ ){//文字列を数値化
			if( o>0 ){MapData_s->img_int[j][o] = strtol( endptr+1, &endptr, 10);}
			else
				MapData_s->img_int[j][o] = strtol(MapData_s->img[j], &endptr, 10);
		}
	
	j++;
//ここにブレークポイントを置いて、MapData_s->img_int の中身を見ると正常の値が入っている
	}
//ここにブレークポイントを置いて、 MapData_s->img_intの中身を見てみると、変な数字が入っている
	LoadDivGraph( "media\\MapChip.jpg", 18, 6, 3, 32, 32, MapData_s->chip );

whileを抜けたら、値がおかしくなっています。
ローカル変数ではないのでwhileを抜けたら初期化されることはないと思うのですが・・。
何が原因なのでしょうか・・・。

一応マップ初期化関数のコード全部載せておきます。

コード:

//マップ初期化関数
void Map_Initialize( MapData *MapData_s ){	

	int j=0;
	char *endptr;
	
	if( (MapData_s->fp = fopen("media\\test.csv","r")) == NULL){//ファイル開く
		MessageBox( NULL, "ファイルが存在しないか、壊れています。", "open file error!! ", MB_OK);//エラー
		exit(1);
	}
	while( fgets(MapData_s->data, 375, MapData_s->fp) !=NULL ){//ファイル読込
		
		for(int i=0; i< 370 ; i++){//文字列を二次元に
			MapData_s->img[j][i] = MapData_s->data[i];
		}

		for( int o=0 ; o < 20 ; o++ ){//文字列を数値化
			if( o>0 ){MapData_s->img_int[j][o] = strtol( endptr+1, &endptr, 10);}
			else
				MapData_s->img_int[j][o] = strtol(MapData_s->img[j], &endptr, 10);
		}
	
	j++;
//値正常(while内)
	}
//値異常(while外)
	LoadDivGraph( "media\\MapChip.jpg", 18, 6, 3, 32, 32, MapData_s->chip );//マップチップ読込
}
なぜ変な値が入ってるのかもうわかりません・・・・。
どこも上書きしてないし、ポインタを使ってるからコピーに処理してるということもないはずなのに・・・。
それに、 if(Mapchip_No == 1)という処理するとエラーが起きないということは、きちんとデータが入ってるってことだし・・
DrawFormat()で表示させると、変な値が入ってるし・・。アドレスを指してるだけ?

また、変換後に
if( Mapchip_No > 18 ){//現在のマップチップが18以上なら
DrawFormatString(0,30,GetColor(255,255,255),"%d",Mapchip_No);//その値を表示
}
としてみると、値が表示されます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#21

投稿記事 by softya(ソフト屋) » 12年前

Map_InitializeでMapData_s->img_int[j][o]に異常な値が代入されていないかチェックしてみてください。あとインデントは正しく使いましょう。
あと気になるのは、MapData_s->chipの配列がちゃんと足りているかなどですかね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#22

投稿記事 by 楽しいC » 12年前

どこで変になってるのかわかりましたが、どうしてなってしまうのかわかりません・・・。

whileを10回実行すると MapData_s->img_int[j][0(ゼロ)] が 0 になり、11回目・12回目・13回目と進むにつれてMapData_s->img_int[j][1、2、3...]の値が0になり、15回目に入ると、
MapData_s->img_int[j][0(ゼロ)]の値に変な数値が入ってしまっています。

while( fgets(MapData_s->data, 375, MapData_s->fp) !=NULL ){
1週目→正常
2週目→正常
3週目→正常
4週目→正常
.
.
.
10週目→異常   MapData_s->img_int[0][0~12]番目の値が 0 に
11週目→異常   MapData_s->img_int[1][0~12]番目の値が 0 に
11週目→異常   MapData_s->img_int[2][0~12]番目の値が 0 に
  ・
  ・
  ・
14週目→異常  MapData_s->img_int[3][0~12]番目の値が 0 に
15週目→異常  MapData_s->img_int[4][0~12]番目の値が 0 になり、MapData_s->img_int[0][0~19]番目の値に変な数値(847204など)

この時MapData_s->imgの中身は正常です。

違反が起きる理由は分かったのですが、なぜ変な値が入ってしまうのかはわかりません・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#23

投稿記事 by softya(ソフト屋) » 12年前

添字がoが15で問題が出るなら実際のcsvのデータを確認して16番目があるかが問題ですね。
調べてみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#24

投稿記事 by 楽しいC » 12年前

縦が15、横がT なので、 15の20でした・・・。

どこが間違ってるのか・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#25

投稿記事 by softya(ソフト屋) » 12年前

楽しいC さんが書きました:縦が15、横がT なので、 15の20でした・・・。

どこが間違ってるのか・・
問題のcsvを貼り付けてもらえますか、説明が良く分からないので。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#26

投稿記事 by 楽しいC » 12年前

255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 255 1 1 1 255 255 255 255 255
255 255 255 255 255 255 255 255 255 255 255 1 255 1 1 1 1 255 255 255
1 1 255 255 255 255 1 1 1 1 255 255 255 255 1 1 1 1 1 1
1 1 1 1 255 1 1 1 1 1 1 255 255 255 255 255 255 255 255 1
1 1 1 1 255 255 255 255 255 1 1 1 1 1 1 1 255 255 255 255
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1


すみません。csvファイルをアップしたかったのですが仕方がわからなかったので、書かれている数字をコピーして貼り付けました。
見ずらかったらごめんなさい。こちらは、エクセルで開いたものです。


これはテキストで開いたものです
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,255,1,1,1,255,255,255,255,255
255,255,255,255,255,255,255,255,255,255,255,1,255,1,1,1,1,255,255,255
1,1,255,255,255,255,1,1,1,1,255,255,255,255,1,1,1,1,1,1
1,1,1,1,255,1,1,1,1,1,1,255,255,255,255,255,255,255,255,1
1,1,1,1,255,255,255,255,255,1,1,1,1,1,1,1,255,255,255,255
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1

みずらいかもしれませんが、よろしくお願いします。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#27

投稿記事 by softya(ソフト屋) » 12年前

MapData の構造体の最新も貼り付けてもらえますか?再現してみます。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#28

投稿記事 by 楽しいC » 12年前

ありがとうございます。


//GV.h

//マップデータ
struct MapData{
char img[15][80]; //文字列データ
int img_int[15][20];//数値
int chip[18]; //マップチップ
char data[370];
int img_flag; //画像があるかどうか
FILE *fp;
};

です。
テストなので、添え字に直接数字を入れています。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#29

投稿記事 by softya(ソフト屋) » 12年前

配列のサイズと処理にループやサイズがずれているのメモリ上データの破壊をしています。
問題は、
char img[15][80]; //文字列データ

char data[370];
です。

Map_Initializeの処理と見比べてください。
あと
char img[15][80]; //文字列データ

char data[370];
は使い捨てで保存不要なので構造体上に必要ありません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#30

投稿記事 by 楽しいC » 12年前

ご返信ありがとうございます!

配列をいろいろ変えながらやったらできたのですが、なぜできたのかわかりません。

csvの縦のサイズは、15なので終了の行も合わせて16必要で、行の最後も表す分も含めて81必要だと思い、それぞれ変えてみたのですが、これで解決でよろしいでしょうか?
char data[81];
char img[16][81]; //文字列データ

また、構造体からローカル変数に移動させると、

strtol関数の
return (long) strtoxl(&__initiallocalestructinfo, nptr, (const char **)endptr, ibase, 0);
この位置で、アクセス違反が起きます。

位置を変えただけで、違反が起きるということは、やり方が間違っているということですか・・?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#31

投稿記事 by softya(ソフト屋) » 12年前

はい。間違っています。
Map_Initializeの処理で

while( fgets(MapData_s->data, 375, MapData_s->fp) !=NULL ){//ファイル読込
なので最大dataは375は必要です。

for(int i=0; i< 370 ; i++){//文字列を二次元に
なので、iを添え字に使う部分は0最大369つまり370個の要素がないと違反が起きます。

char data[81];
char img[16][81]; //文字列データ
だと370 や375の配列の要素数として足りませんし、81だと改行を合わせて80文字しか格納できませんので足らない可能性があります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#32

投稿記事 by 楽しいC » 12年前

全然先に進まずすみません・・・

1行の文字データが 255,(4文字)+20 で最大80なので、

コード:

void Map_Initialize( MapData *MapData_s ){	

	char Map_data[81];//文字データ
	char MapData_img[15][81];	//文字列データ
	 int j=0;
	char *endptr;
	
	if( (MapData_s->fp = fopen("media\\test.csv","r")) == NULL){//開く
		MessageBox( NULL, "ファイルが存在しないか、壊れています。", "open file error!! ", MB_OK);//エラー
		exit(1);
	}

	while( fgets(Map_data, 81, MapData_s->fp) !=NULL ){//1行のデータの数が80で終了文字の1を足して81回ループ
		
		for(int i=0; i< 81 ; i++){//1行のデータの数が80で終了文字の1を足して81回ループ
			MapData_img[j][i] = Map_data[i];//文字列を2次元配列に
		}

		for( int o=0 ; o < 20 ; o++ ){//数値化
			if( o>0 ){MapData_s->img_int[j][o] = strtol( endptr+1, &endptr, 10);}
				else
					MapData_s->img_int[j][o] = strtol(MapData_img[j], &endptr, 10);
		}
	
	j++;
	}
	LoadDivGraph( "media\\MapChip.jpg", 18, 6, 3, 32, 32, MapData_s->chip );
}
このようにしましたが、違反が起きてしまいます。
また、どちらも375にしても違反が起きてしまいます

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#33

投稿記事 by softya(ソフト屋) » 12年前

どこの行でエラーが起きますか?
この機会にデバッガの使い方を覚えましょうか。
デバック開始で実行すると該当行を示してくれるはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#34

投稿記事 by 楽しいC » 12年前

返信ありがとうございます

strtol.cの
return (long) strtoxl(&__initiallocalestructinfo, nptr, (const char **)endptr, ibase, 0);
で違反が起きています。

発生場所は
while( fgets(Map_data, 80, MapData_s->fp) !=NULL ){
を抜けた位置です。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#35

投稿記事 by softya(ソフト屋) » 12年前

そういえば違反メッセージの詳細を聞いていませんでしたので教えてください。

あとstrtolを呼び出しているのは、
if( o>0 ){MapData_s->img_int[j][o] = strtol( endptr+1, &endptr, 10);}
else
MapData_s->img_int[j][o] = strtol(MapData_img[j], &endptr, 10);
の2つしか無いのでどちらかを特定してください。
呼出し履歴で分かりませんか?

勘で言えばstrtol( endptr+1, &endptr, 10);のendptr+1のendptrがやばい気はしないでも無いんですけどね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#36

投稿記事 by 楽しいC » 12年前

メッセージの内容は
○○○.exeの0x771c685でハンドルされていない例外が発生しました:0xc000005:場所 0x00000123に書き込み中にアクセス違反が発生しました。

です。

呼び出し履歴を確認しても関数単位でしかわかりませんでした。

でも、最初は
MapData_s->img_int[j][o] = strtol(MapData_img[j], &endptr, 10);
を処理して

次からは
MapData_s->img_int[j][o] = strtol( endptr+1, &endptr, 10);
を処理するようにしています。

本当になってくれてるかわかりませんが・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#37

投稿記事 by softya(ソフト屋) » 12年前

呼出履歴でMap_Initializeを選択すればMap_Initializeが表示されてoの数値とかstrtolの呼び出し引数の内容とかも確認できるはずです。
0x00000123に書込み中と言うことなので、strtolそのものじゃないかも知れませんが少なくともポインタ関係を疑ったほうが良い値です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#38

投稿記事 by 楽しいC » 12年前

oは正常でしたが、jが16回ループしていました。
また、endptrも正常でした
endptr:","となっています。

また、img_int の値を見てみると

1,3,5,7,9,11,13 の値がおかしくなっていて、

MapData_s->img_int[1,3,5,7,9,11,13][0~3]が0 0 5 となっていました。

MapData_img[j]のほうもおかしくなっていて

MapData_img[1,3,5,7,9,11,13] [0~1]が 0 10 となっていました。

なにか関係があるのでしょうか

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#39

投稿記事 by softya(ソフト屋) » 12年前

それは改行も含めて読むので[81]では足らないのでは無いでしょうか?
文字が79バイトで改行が2バイト、ナル文字が1バイトですから最低82バイト必要です。
ギリギリも気持ち悪いので100は取りたいですね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#40

投稿記事 by 楽しいC » 12年前

あ、きちんと表示されました。
でも、やはり違反は起きてしまいます・・・。

うーん・・・
他に思い当たる箇所はないし・・・・

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#41

投稿記事 by softya(ソフト屋) » 12年前

楽しいC さんが書きました:あ、きちんと表示されました。
でも、やはり違反は起きてしまいます・・・。

うーん・・・
他に思い当たる箇所はないし・・・・
こちらでテストする分には再現性はありません。
表示されて違反が起きるという状況がいまいち分からないのですが・・・。詳細な説明とコード全体の添付をお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#42

投稿記事 by 楽しいC » 12年前

表示されてというのは、ちゃんと値が入っていたということです。説明不足ですみません・・。

実行すると、

0x77526850 で初回の例外が発生しました: 0xC0000005: 場所 0x00000025 に書き込み中にアクセス違反が発生しました。
0x77526850 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000025 に書き込み中にアクセス違反が発生しました。

という違反が発生します。
ブレークポイントを置くと、while文を抜けた位置で違反が起きています。
それ以外は、すべて正常で、変な数字が入っているということもありません。


全体のコードは

Map_EP1.cpp

コード:

#include "GV.h"

static int MAP_DATA[Map_WIDTH][Map_HEIGHT];


void Map_Initialize( MapData *MapData_s ){	

	char Map_data[82];
	char MapData_img[15][82];	//文字列データ
	 int j=0;
	char *endptr;
	
	if( (MapData_s->fp = fopen("media\\test.csv","r")) == NULL){
		MessageBox( NULL, "ファイルが存在しないか、壊れています。", "open file error!! ", MB_OK);
		exit(1);
	}
	while( fgets(Map_data, 82, MapData_s->fp) !=NULL ){
		
		for(int i=0; i< 82 ; i++){
			MapData_img[j][i] = Map_data[i];
		}

		for( int o=0 ; o < 20 ; o++ ){
			if( o>0 ){MapData_s->img_int[j][o] = strtol( endptr+1, &endptr, 10);}
				else
					MapData_s->img_int[j][o] = strtol(MapData_img[j], &endptr, 10);
		}
	
	j++;
	}
	LoadDivGraph( "media\\MapChip.jpg", 18, 6, 3, 32, 32, MapData_s->chip );
}

void Map_Draw(MapData *MapData_s){	

	for( int y=0 ; y<15 ; y++ ){
		for( int x=0 ; x<20 ; x++ ){
			if( MapData_s->img_int[y][x] != 255 ){//もしも、マップデータが255以外なら
				int Mapchip_No = MapData_s->img_int[y][x];
				int px = Mapchip_No % 16;
				int py = Mapchip_No / 16;
					Mapchip_No = py * 6 + px;
					DrawFormatString(0,30,GetColor(255,255,255),"%d",Mapchip_No);
				//	if( MapData_s->img_int[y][x] ==1 ){
						DrawGraph( x*32, y*32,MapData_s->chip[Mapchip_No], TRUE );
					//}
			}
		}
	}
}

PlayerMove.cpp

コード:

//プレイヤー移動処理
#include "GV.h"

//初期座標
static const double PLAYER_X=130;
static const double PLAYER_Y=130;


//向き 初期チップ
static const int DIREC_RIGHT=3;//右
static const int DIREC_LEFT =9; //左


//移動量増加を中止するときの移動量
static const double PLAYER_VX_ABORT = 0.1;//歩行
static const double PLAYER_VY_ABORT = 2.0;//ジャンプ


//移動量
static  double PLAYER_VX = 0.1;//歩行
static  double PLAYER_VY = 0.5;//ジャンプ


//データ初期化
void Player_Initialize(Player *Player_s){

	//ゼロクリア
	memset( Player_s, 0, sizeof(Player_s) );

	//フラグを立てる
	Player_s->flag = 1;

	//初期位置
	Player_s->x = PLAYER_X;
	Player_s->y = PLAYER_Y;

	//画像ロード
	LoadDivGraph( "media\\player1.png", 12, 3, 4, 24, 32, Player_s->img );
	
}

//移動量計算
void Player_Move( Player *Player_s ){

	if( Keyboard_Get(KEY_INPUT_D) > 0 && (double)Player_s->vx <= 1.9 ){//右
		Player_s->vx   += PLAYER_VX;  //移動量Xをプラス
		Player_s->direc = DIREC_RIGHT;//向きを左に
		
	}

	if( Keyboard_Get(KEY_INPUT_A) > 0 && (double)Player_s->vx >= -1.9 ){//左
		Player_s->vx   -= PLAYER_VX; //移動量Xをマイナス
		Player_s->direc = DIREC_LEFT;//向きを右に
		
	}

	//慣性処理
	if( Keyboard_Get(KEY_INPUT_D) <= 0 && Player_s->vx > 0 ){
		Player_s->vx -= PLAYER_VX_ABORT;//徐々に移動量を減らす
	
	}
	if(Keyboard_Get(KEY_INPUT_A) <= 0 && Player_s->vx < 0 ){
		Player_s->vx += PLAYER_VX_ABORT;//徐々に移動量を足す
	}

	//座標更新
	Player_s->x += Player_s->vx;
	Player_s->y += Player_s->vy;

}

//描画
void Player_Draw( Player Player_s ){

	DrawGraph( Player_s.x, Player_s.y, Player_s.img[Player_s.now_img+Player_s.direc], FALSE );
}

//歩行モーション
void Player_Motion( Player *Player_s ){

		static int Motion_count = 0;//カウンタ
		
		if( (int)Player_s->vx < 0 && Motion_count % 5 == 0 ){
		Motion_count = 0;//カウンタ初期化
		Player_s->now_img = (Player_s->now_img + 1) % 3;//現在のモーション画像選択
	}

		if( (int)Player_s->vx > 0 && Motion_count % 5 == 0 ){
		Motion_count = 0;//カウンタ初期化
		Player_s->now_img = (Player_s->now_img + 1) % 3;//現在のモーション画像選択
	}

	Motion_count ++;
}

void Map_Hit_Caloc( Player *Player_s ){

	//int Hit_flag = Map_Hit();

	//if( Hit_flag == 1 ){
	//	Player_s->x -= Player_s->vx ;
	//}
}
Struct.h

コード:

//構造体//

#ifndef STRUCT_H //include guard
#define STRUCT_H

//プレイヤー
struct Player{
	double x;		//座標
	double y;		
	double vx;		//移動量
	double vy;		
	int img[12];	//画像
	int flag;		//フラグ
	int now_img;	//現在の画像
	int direc;		//向き
};

//プレイヤーの銃
struct PlayerBullet{
	double x;	//座標
	double y;
	double vx;	//移動量
	double vy;
	int img;	//画像
	int flag;	//フラグ
};

//マップデータ
struct MapData{
	int  img_int[15][20];//数値
	int  chip[18];		//マップチップ
	int img_flag;		//画像があるかどうか
	FILE *fp;
};
#endif

Main.cpp

コード:

メインcpp

#include "GV.h"


//文字・色の初期化//
int Key[256];
int Color = GetColor( 255, 255, 255 ); //基本(黒)

 int GetHitKeyStateAll_2(int GetHitKeyStateAll_InputKey[]){



	char GetHitKeyStateAll_Key[256];

	 GetHitKeyStateAll( GetHitKeyStateAll_Key );
	    for(int i=0;i<256;i++){
        if(GetHitKeyStateAll_Key[i]==1) GetHitKeyStateAll_InputKey[i]++;
        else                            GetHitKeyStateAll_InputKey[i]=0;
    }
    return 0;
}

 
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
    ChangeWindowMode(TRUE);//ウィンドウモード

	// 画面モードの設定
	SetGraphMode( Map_WIDTH, Map_HEIGHT, 16 );

	if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化

	//Mgr_Load();
	Mgr_Player_Initialize();
	Mgr_Map01_Initialize();
	while(ProcessMessage()==0 && ClearDrawScreen()==0 && GetHitKeyStateAll_2(Key)==0 && Key[KEY_INPUT_ESCAPE]==0){
		//↑メッセージ処理          ↑画面をクリア           ↑入力状態を保存       ↑ESCが押されていない
		
		//メインプログラム
		Keyboard_Update();
		Mgr_Player_Caloc();
		Mgr_Player_Draw();
		Mgr_Map01_Draw();
	 Mgr_Map01_Caloc();

	 //アニメーション再生
	 AnimationContorol();
	 AnimationDraw();

	ScreenFlip();
 }   
 
    DxLib_End();
    return 0;
}

GV.h

コード:

/グローバル管理//

#ifndef GV_H//include guard
#define GV_H
#define GLOBAL extern
#define PI 3.141592654f

//ウィンドウサイズ基本設定
#define Map_WIDTH 600 //横
#define Map_HEIGHT 480//縦

#include "ShootingLib.h"
#include "DxLib.h"
#include "Struct.h"
#include <stdio.h>
#include <windows.h>
#include <math.h>

//グローバル変数

//関数マクロ

//プレイヤー
 void Player_Draw( Player Player_s );
 void Player_Move( Player *Player_s );
 void Player_Initialize(Player *Player_s);
 void Player_Motion( Player *Player_s );
 void Map_Hit_Caloc( Player *Player_s );

 //プレイヤー管理部
 void Mgr_Player_Initialize();
 void Mgr_Player_Caloc();
 void Mgr_Player_Draw();

 //マップ描画
 void Map_Draw( MapData *MapData_s );
 void Map_Initialize( MapData *MapData_s );
 void Map_Caloc();
 //int  Map_Hit( MapData *MapData_s );

 //マップ管理部
 void Mgr_Map01_Draw();
 void Mgr_Map01_Initialize();
 void Mgr_Map01_Caloc();

 //Get関数(変数渡し)
 Player Player_Get();

#endif

MapMgr.cpp

コード:

//エピソード1管理部
#include "GV.h"

static struct MapData MapData_s;

void Mgr_Map01_Initialize(){

	Map_Initialize( &MapData_s );
}

void Mgr_Map01_Caloc(){
	Map_Caloc();
}

void Mgr_Map01_Draw(){

	Map_Draw( &MapData_s );
}

PlayerMgr

コード:

//プレイヤー情報管理
#include "GV.h"

static struct Player Player_s;//実体定義

//データ初期化
void Mgr_Player_Initialize(){
	
	 Player_Initialize( &Player_s );//プレイヤーデータを初期化する
}

//プレイヤー状態計算
void Mgr_Player_Caloc(){

	if( Player_s.flag == TRUE ){
	Player_Move( &Player_s );	//動きを計算する
	Player_Motion( &Player_s );	//表示すべき画像を計算する
	Map_Hit_Caloc( &Player_s );
	}
}

//プレイヤー表示
void Mgr_Player_Draw(){

	if( Player_s.flag == TRUE ){
		Player_Draw( Player_s );	//表示
	} DrawFormatString(0,0,GetColor(255,255,255),"%lf",Player_s.x);
}


Player Player_Get(){

	return Player_s;//プレイヤーデータを与える
}

多分image関数とかでエラーがでるかもしれませんが、お願いします・・・。

一応これが全体のコードですが、抜けてるところなどあるかもしれません。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#43

投稿記事 by softya(ソフト屋) » 12年前

前にも指摘しましたがインデントが乱れています。正しくインデントしてください。
「mixcpp/投稿前チェックリスト - PukiWiki」
http://uchan.net/w/index.php?mixcpp%2F% ... 5%B9%A5%C8

抜けがあったのでコメントして動かしましたが違反が出ず再現性はありませんね。

以上はコメント化かダミーで対処しました。
//#include "ShootingLib.h"

// Mgr_Player_Initialize();

// Mgr_Player_Caloc();
// Mgr_Player_Draw();

//アニメーション再生
//AnimationContorol();
//AnimationDraw();

// Map_Caloc();


int Keyboard_Get(int) { return 0; }
void Keyboard_Update() {}

データとソース一式を何処かにアップロードしてもらうか、ここに会員登録してもらって圧縮添付してもらうほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#44

投稿記事 by 楽しいC » 12年前

画像認証で登録できなくなってしまったので、アップロードしました。
また、ImageMgrがあるかもしれませんが、Main関数から切り離しているので、そこはまったく関係ないところです。

http://www1.axfc.net/uploader/O/

ファイル名O_214242.zip 説明:なんでも質問
PW:nandemo

です。

インデントって、段落ですよね?インデントしたつもりで、読みずらくてすみません・・。


一応開けるか確かめましたが、開けなかったらもう一度アップしなおします。

もしかしたら、マップ関連じゃないところで違反が起きてるということですかね・・?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#45

投稿記事 by softya(ソフト屋) » 12年前

でかいですね。
もしかして、debug/ipchフォルダや拡張子.sdfも含まれてませんか?
不要ですので次回は消して圧縮してくださいね。
楽しいC さんが書きました: もしかしたら、マップ関連じゃないところで違反が起きてるということですかね・・?
たぶん、そうでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#46

投稿記事 by 楽しいC » 12年前

すみません・・アップロードとか初めてで手探りでやっていました。

マップ関連で違反が起きてないとなるとプレイヤー関連でしょうか・・

勝手ながら再現よろしくお願いします・・・。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#47

投稿記事 by softya(ソフト屋) » 12年前

あれ? csvが16行有る気が。
char MapData_img[15][82]; //文字列データ
だから15行しか読めませんよ。jが15になっている時点で配列添え字範囲外です。

【補足】
最後に空白行がありますね。
これは読み飛ばさないと行けません。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#48

投稿記事 by 楽しいC » 12年前

うっ・・・これ16行まであったんですか・・・
何も書いてなかったので、気づきませんでした・・・・。

この程度で長々とお付き合いいただきありがとうございます。。

まだ、当たり判定のレイヤーや、マップスクロールと課題は沢山ありますが、がんばっていこうと思います!

ありがとうございます!

最後に、読み飛ばさないといけないとありますが、配列を16にするだけではだめですか?一応これで表示はできました。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 13年前
住所: 東海地方
連絡を取る:

Re: Platinumでマップ表示

#49

投稿記事 by softya(ソフト屋) » 12年前

楽しいC さんが書きました:うっ・・・これ16行まであったんですか・・・
何も書いてなかったので、気づきませんでした・・・・。

この程度で長々とお付き合いいただきありがとうございます。。

まだ、当たり判定のレイヤーや、マップスクロールと課題は沢山ありますが、がんばっていこうと思います!

ありがとうございます!

最後に、読み飛ばさないといけないとありますが、配列を16にするだけではだめですか?一応これで表示はできました。
空白行なので読み飛ばすべきです。どんな誤動作をしても保証できません。
あと、このシステムはマップサイズの可変長に非対応だったり決め打ち部分が多いと思います。
char MapData_img[15][82]; //文字列データ
も無駄ですし。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

楽しいC

Re: Platinumでマップ表示

#50

投稿記事 by 楽しいC » 12年前

表示させることだけを考えていたので、今度は、マジックナンバーをなくして、汎用性(?)が高いものに改良していきたいと思っています!

たしかに、飛ばした方が安全ですよね。飛ばせるようやってみます!

長々と本当にお付き合いいただきありがとうございます!
後は、16行を飛ばして、汎用性を高く改良するだけなので、これで解決にします!

ありがとうございます!!!

閉鎖

“C言語何でも質問掲示板” へ戻る