表示が変になりました

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Qloeh
記事: 35
登録日時: 10年前

表示が変になりました

#1

投稿記事 by Qloeh » 9年前

毎回すみません。マップデータを読み込ませる事に成功しました。
ですが、表示させると右端5マスしか描画されません。
ソースコードは下の通りです。

コード:

bool LoadMapFieldData(){
	int fh = 0;
	char pass[STR_MAX] = { NULL };
	char buf[256] = {NULL};
	sprintf_s(pass, "%s%s%s", MAP_ROOT, maplist.list[maplist.map_id], MAP_IMAGEROOT);
	if ((fh = FileRead_open(pass)) == 0){
		MB("MapImage Cannot Open");
		return false;
	}
	
	
	for (int k = 0; k < 4; k++){
		for (int i = 0; i < map.data.num_y; i++){
			
			for (int j = 0; j < map.data.num_x; j++){

				if (FileRead_read(&buf[j], sizeof(BYTE), fh) == -1){
					MB("MapImage Cannot Read");
					FileRead_close(fh);
					return false;
				}

				
				
				map.data.mapdata[k][j][i] = ((buf[1]&0xff)<<8|(buf[0]&0xff));
			}
		}
	}
	if (FileRead_close(fh) == -1){
		MB("MapImage Cannot Close");
		return false;
	}
	return true;
}

bool LoadMapGraph(){
	char pass[STR_MAX] = { NULL };
	sprintf_s(pass, "%s%s%s", MAP_ROOT, maplist.list[maplist.map_id], MAP_GRAPH);
	if ((map.data.num = LoadDivImageFile(pass, map.data.mapchip, map.data.size_x, map.data.size_y)) == -1){
		MB("MapChip Cannot Read");
		return false;
	}
	
	return true;
}

void DrawMap(int no ,bool flag){
	for (int i = -1; i <map.data.num_x; i++){
		for (int j = -1; j <map.data.num_x; j++){
			DrawGraph((j * map.data.size_x), (i * map.data.size_y), map.data.mapchip[map.data.mapdata[no][i][j]],flag);
		}
	}
}

コード:

#include"Common.h"

void Map_Update(){
	if (CheckHitKey(KEY_INPUT_C) == 1){
		SceneMgr_ChangeScene(GAME_MENU);
	}
}

void Map_Draw(){
	DrawMap(0, false);
	DrawMap(1, true);


	DrawMap(2, true);
}

void Map_Change(){

}

コード:

#include"Common.h"

bool MapInit_Load(){

	if (LoadMapData() == false)return false;
	
	if (LoadMapFieldData() == false)return false;
	if (LoadMapGraph() == false)return false;
	return true;
}

void MapInit_Update(){
	MapInit_Load();
	SceneMgr_ChangeScene(GAME_MAP);
}

void MapInit_Draw(){

}
足りない情報などありましたらご連絡下さい。
蛇足ですが、三次元配列の事をよく分かっているわけではないので、
テキストデータの方に不具合がある可能性があるので上げておきます。

コード:

0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0
よろしかったら回答お願いします

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 表示が変になりました

#2

投稿記事 by みけCAT » 9年前

Qloeh さんが書きました:

コード:

bool LoadMapFieldData(){
	int fh = 0;
	char pass[STR_MAX] = { NULL };
	char buf[256] = {NULL};
数値の初期化にポインタかもしれないNULLを使うのは良くないです。素直に0と書いてください。

Qloeh さんが書きました:

コード:

	for (int k = 0; k < 4; k++){
		for (int i = 0; i < map.data.num_y; i++){
			
			for (int j = 0; j < map.data.num_x; j++){

				if (FileRead_read(&buf[j], sizeof(BYTE), fh) == -1){
					MB("MapImage Cannot Read");
					FileRead_close(fh);
					return false;
				}

				
				
				map.data.mapdata[k][j][i] = ((buf[1]&0xff)<<8|(buf[0]&0xff));
			}
		}
	}
  • char型の配列に値を読み込んでいるのに、BYTE型のサイズを読み込みに使っているのはわかりにくいです。
  • せっかく読み込んでも、読み込んだデータを各jのループで最初に読み込む2バイトしか使わないのはおかしい気がします。
Qloeh さんが書きました:

コード:

bool LoadMapGraph(){
	char pass[STR_MAX] = { NULL };
同様にNULLではなく0を使う方がいいでしょう。
Qloeh さんが書きました:

コード:

void DrawMap(int no ,bool flag){
	for (int i = -1; i <map.data.num_x; i++){
		for (int j = -1; j <map.data.num_x; j++){
			DrawGraph((j * map.data.size_x), (i * map.data.size_y), map.data.mapchip[map.data.mapdata[no][i][j]],flag);
		}
	}
}
  • iとjのループの両方の範囲にmap.data.num_xが使用されているのは不自然です。
  • map.data.mapdataの定義がわからないので断定はできませんが、map.data.mapdata[no][-1][-1]は確保された領域の外である疑いがあります。
    確保された領域の外にはアクセスしてはいけません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

Qloeh
記事: 35
登録日時: 10年前

Re: 表示が変になりました

#3

投稿記事 by Qloeh » 9年前

num_xは完全にミスですね。有難う御座います。
NULL配列の中身を0に修正し、sizeofもいじってみましたが、結果は変わりませんでした。
それほど代わり映えしませんが、ソースを上げておきます。

コード:

bool LoadMapFieldData(){
	int fh = 0;
	char pass[STR_MAX] = { NULL };
	char buf[256] = {0};
	sprintf_s(pass, "%s%s%s", MAP_ROOT, maplist.list[maplist.map_id], MAP_IMAGEROOT);
	if ((fh = FileRead_open(pass)) == 0){
		MB("MapImage Cannot Open");
		return false;
	}
	
	
	for (int k = 0; k < 4; k++){
		for (int i = 0; i < map.data.num_y; i++){
			
			for (int j = 0; j < map.data.num_x; j++){

				if (FileRead_read(&buf[j], sizeof(buf[j]), fh) == -1){
					MB("MapImage Cannot Read");
					FileRead_close(fh);
					return false;
				}

				
				
				map.data.mapdata[k][j][i] = ((buf[1]&0xff)<<8|(buf[0]&0xff));
			}
		}
	}
	if (FileRead_close(fh) == -1){
		MB("MapImage Cannot Close");
		return false;
	}
	return true;
}
読み込みの問題については、この形の関数をよく知らないとしか……調べてはみましたが、
実行すると結構深刻なエラー(パス周りのエラー)が出るので八方塞な感じです。

Qloeh
記事: 35
登録日時: 10年前

Re: 表示が変になりました

#4

投稿記事 by Qloeh » 9年前

試しに三次元配列を止めてみた所多少改善されました。
ですが、今度は空白のところを飛ばして読み込んではくれません。
空白で区切るいいヒントはありますか?

閉鎖

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