特定の箇所だけ画像が読み込めない

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

特定の箇所だけ画像が読み込めない

#1

投稿記事 by wasawasa » 11年前

下記のように、txtファイルからデータを抜き出し、それを元にファイルのパスとなる文字列を組み立てて画像を読み込み表示させるATile_ini関数とNTile_ini関数をまとめて呼び出すTile_ini関数をTileData.cppに書いて、それをmain関数で呼び出して実行したところ、NTile_ini関数で表示する筈の画像が読み込ません。
デバッグ用のメッセージを見ると、ファイルが見つからないというような文が表示されていましたが、組み立てたファイルのパスは間違っていないことを確認しましたし、画像ファイルも置いてあります。そしてNTile_ini関数で画像を読み込めなかった理由を探るために様々な部分に同様の画像を表示させる記述(//デバッグ用表示とコメントを入れた部分)を挿入してプログラムを実行させたところ、本来NTile_ini関数で呼び出す筈の部分以外の全ての記述で画像が表示できてしまいました。ATile_ini関数で読み込むtxtファイルとNTile_ini関数で読み込むtxtファイルは同一のツールで生成したものであり、念のため確認してみたものの問題はありませんでした。

似たような記述であるATile_ini関数とNTile_ini関数両方で画像が表示できないのであれば記述が悪いのだと理解できます。
NTile_ini関数で読み込もうとした画像が読み込めないのであれば画像ファイルやパスのスペル、フォルダ構成などに問題あるのだと分かります。
main.cppで読み込めてTileData.cppで読み込めないのであればTileData.cppが悪いのだと理解できます。
しかし、本来NTile_ini関数で表示する部分以外の全てにおいて画像を読み込み表示できてしまったためどこに問題があるのか全く分かりません。
一体何故TileData.cppの145行目で画像を読み込まないのでしょうか?どなたかよろしくお願いします。

TileData.cpp

コード:

#include "DxLib.h"
#include "stdio.h"
#include "TileDataFrame.h"

struct ATileData ATile[18];
struct NTileData NTile[3];

void ATile_ini(){
    int file,i,j,k,n=0,m=0,ed=0;
	int l;//テスト用
    int text[32];
    char textc[32];
	int ATRule[48][4][2];
	int Pic[192];
	int maketipsc;//オートタイルチップを作成するスクリーン
	char FPass[] = "./Data/Pics/TileA/";
	char Exten[] = ".png";
	char pass[64];
	//-オートタイル格納用配列の読み込み-
	file = FileRead_open( "./Data/Txt/ATileRuleData.txt" ) ;
	if(file==NULL){printfDx("read error\n");return;}
	while(1){
        for(i=0;i<32;i++){
            text[i] = FileRead_getc(file);
            textc[i] = text[i];
            if(textc[i]=='/'){while(FileRead_getc(file)!='\n'){i=-1;continue;}}
            if(text[i]==',' || text[i]=='\n'){textc[i]='\0';break;}
            if(text[i]==EOF){ed=1;break;}
        }
		if(ed==1){FileRead_close(file);break;}
		ATRule[m/8][(m/2)%4][m%2] = atoi(textc);
        m++;
	}
	n=0;m=0;ed=0;
	//-オートタイルデータの読み込み-
    file = FileRead_open( "./Data/Txt/ATileData.txt" ) ;
    if(file==NULL){printfDx("read error\n");return;}
    while(1){
        for(i=0;i<32;i++){
            text[i] = FileRead_getc(file);
            textc[i] = text[i];
            if(textc[i]=='/'){while(FileRead_getc(file)!='\n'){i=-1;continue;}}
            if(text[i]==',' || text[i]=='\n'){textc[i]='\0';break;}
            if(text[i]==EOF){ed=1;break;}
        }
        if(ed==1){FileRead_close(file);break;}
        switch(m){
			case 0: for(i=0;i<32;i++){
				ATile[n].name[i] = textc[i];
					}
					break;
            case 1: ATile[n].pri = atoi(textc);break;
            case 2: ATile[n].pat = atoi(textc);break;
        }
        m++;
        if(m==3){m=0;n++;}
    }
	//画像データの読み込み
	for(i=0;i<18;i++){
		strcpy(pass,FPass);strcat(pass,ATile[i].name);strcat(pass,Exten);
		for(j=0;j<192;j++){
			Pic[j] = MakeGraph(16,16);
		}
		LoadDivGraph( pass , 48*ATile[i].pat , 6*ATile[i].pat , 8 , 16 , 16 , Pic ) ;
		for(k=0;k<4;k++){
			for(j=0;j<48;j++){
				ATile[i].pics[k][j] = MakeGraph(32,32);
			}
		}
		for(k=0;k<ATile[i].pat;k++){
			for(j=0;j<48;j++){
				maketipsc = MakeScreen( 32, 32, TRUE ) ;
				SetDrawScreen( maketipsc ) ;
				DrawGraph( 0, 0,Pic[ATRule[j][0][0]+6*ATRule[j][0][1]*ATile[i].pat],TRUE);
				DrawGraph(16, 0,Pic[ATRule[j][1][0]+6*ATRule[j][1][1]*ATile[i].pat],TRUE);
				DrawGraph( 0,16,Pic[ATRule[j][2][0]+6*ATRule[j][2][1]*ATile[i].pat],TRUE);
				DrawGraph(16,16,Pic[ATRule[j][3][0]+6*ATRule[j][3][1]*ATile[i].pat],TRUE);
				SetDrawScreen( DX_SCREEN_FRONT ) ;
				ATile[i].pics[k][j] = maketipsc;
			}
		}		
		memset(pass,0,sizeof(pass));
	}
	
	//-テスト-
	for(i=0;i<18;i++){
		ClearDrawScreen();//テスト
		for(l=0;l<4;l++){
			for(j=0;j<3;j++){
				for(k=0;k<16;k++){
					DrawGraph(j*34+l*110,k*34,ATile[i].pics[l][j*16+k],TRUE);//画像表示箇所
				}
			}
		}
		ScreenFlip();WaitKey();//テスト
	}
}

void NTile_ini(){
    int file,i,j,n=0,m=0,ed=0;
	int k,l,a;//テスト
    int text[32];
    char textc[32];
	char FPass[] = "./Data/Pics/TileN/";
	char Exten[] = ".png";
	char pass[64];
	int NTpic;
	int xsize=0,ysize=0;
	//-ノーマルタイルデータの読み込み-
    file = FileRead_open( "./Data/Txt/NTileData.txt" ) ;
    if(file==NULL){printfDx("read error\n");return;}
    while(1){
        for(i=0;i<32;i++){
            text[i] = FileRead_getc(file);
            textc[i] = text[i];
            if(textc[i]=='/'){while(FileRead_getc(file)!='\n'){i=-1;continue;}}
            if(text[i]==',' || text[i]=='\n'){textc[i]='\0';break;}
            if(text[i]==EOF){ed=1;break;}
        }
        if(ed==1){FileRead_close(file);break;}
		if(m==0){
			for(i=0;i<32;i++){
				NTile[n].name[i] = textc[i];
			}
		}
		else if(m>=1&&m<264){
			NTile[n].pri[m-1] = atoi(textc);
		}
		else{
			m=0;
			n++;
			continue;
		}
		m++;
    }
	//-画像データの読み込み-
	for(i=0;i<3;i++){
		for(j=0;j<264;j++){
			NTile[i].pics[j] = MakeGraph(32,32);
		}
		strcpy(pass,FPass);strcat(pass,NTile[i].name);strcat(pass,Exten);
		DrawFormatString( 0, 0, GetColor(255,255,255), "%s", pass);//パス点検用1
		DrawFormatString( 0, 20, GetColor(255,255,255), "./Data/Pics/TileN/015-ForestTown01.png");//パス点検用2
		DrawFormatString( 0, 40, GetColor(255,255,255), "./Data/Pics/TileN/%s.png",NTile[i].name);ScreenFlip();WaitKey();ClearDrawScreen();//パス点検用3
		NTpic = LoadGraph(pass) ;//ここで画像が読み込まれない
		DrawGraph( 0, 0,NTpic,TRUE);ScreenFlip();WaitKey();ClearDrawScreen();//デバッグ用表示2
		GetGraphSize( NTpic , &xsize , &ysize ) ;
		LoadDivGraph( pass , (xsize/32)*(ysize/32) , xsize/32 , ysize/32 , 32 , 32 , NTile[i].pics ) ;
	}
	for(i=0;i<3;i++){ClearDrawScreen();//テスト
	for(l=0;l<2;l++){
		for(j=0;j<15;j++){
			for(k=0;k<8;k++){
				DrawGraph( k*32+l*260, j*32,NTile[i].pics[k+j*8+l*120],TRUE);//画像表示箇所@表示できない
			}
		}
	}ScreenFlip();WaitKey();
	}
a=LoadGraph("./Data/Pics/TileN/015-ForestTown01.png");//デバッグ用表示4
DrawGraph( 300, 0,a,TRUE);ScreenFlip();WaitKey();
}

void Tile_ini(){
	ATile_ini();
	NTile_ini();
}
main.cpp

コード:

#include "DxLib.h"
#include "main.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK ); //ウィンドウモード変更と初期化と裏画面設定

		Tile_ini();ScreenFlip();
		int a,b,c,d;
		char FPass[] = "./Data/Pics/TileN/";
		char Exten[] = ".png";
		char text[32] = "001-G_Water01";
		char text2[32]= "015-ForestTown01";
		char pass[64];
		char pass2[64];
		a=LoadGraph("./Data/Pics/TileA/001-G_Water01.png");
		b=LoadGraph("./Data/Pics/TileN/015-ForestTown01.png");
		strcpy(pass,FPass);strcat(pass,text);strcat(pass,Exten);
		strcpy(pass2,FPass);strcat(pass2,text2);strcat(pass2,Exten);
		c=LoadGraph(pass);d=LoadGraph(pass2);
		DrawGraph( 0, 0,a,TRUE);//デバッグ用表示5
		DrawGraph( 0, 0,b,TRUE);//デバッグ用表示6
		DrawGraph( 300, 300,c,TRUE);//デバッグ用表示7
		DrawGraph( 300, 300,d,TRUE);ScreenFlip();WaitKey();//デバッグ用表示8
        DxLib_End(); // DXライブラリ終了処理
        return 0;
}  
TileDataFrame.h

コード:

#ifndef DEF_TileDataFrame_H //二重include防止
#define DEF_TileDataFrame_H

struct ATileData{
	int pics[4][48];//
	int pri;//
	int pat;//
	char name[32];//画像名
};
struct NTileData{
	int pics[264];
	int pri[264];
	char name[32];//画像名
};

#endif
main.h

コード:

#ifndef DEF_Main_H //二重include防止
#define DEF_Main_H

//-TileData.cpp-
void Tile_ini();
//-Scene.cpp-
void scene();

#endif
フォルダ構成

コード:

[project]
   ┣プロジェクトファイル一式
   ┗[Data]
          ┣[Pics]
          ┃   ┣[TileA]
          ┃   ┃   ┣001-G_Water01.png
          ┃   ┃   ┣002-G_Shadow01.png
          ┃   ┃   ┣            :           .png
          ┃   ┃   ┗            :           .png
          ┃   ┗[TileB]
          ┃         ┣001-Grassland01.png
          ┃         ┣005-Beach01.png
          ┃         ┗015-ForestTown01.png
          ┗[Txt]
                ┣ATileData.txt
                ┣NTileData.txt
                ┗ATileRuleData.txt
添付ファイル
ATileData.txt
(370 バイト) ダウンロード数: 112 回
NTileData.txt
(1.75 KiB) ダウンロード数: 108 回

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

Re: 特定の箇所だけ画像が読み込めない

#2

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

とりあえずそのままコンパイルして実行可能な形にしました。
ログファイルに記録されたファイル名に改行が挟まっているのが気になりますね。
添付ファイル
gazou_yomikomenai_raw.zip
提示されたファイルをまとめたプロジェクト
(1.89 MiB) ダウンロード数: 110 回
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: 特定の箇所だけ画像が読み込めない

#3

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

117行目で、改行コードとしてCRは切らず、LFのみを切っているため、CRがNTile[n].nameに混ざっているようですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

wasawasa
記事: 94
登録日時: 11年前

Re: 特定の箇所だけ画像が読み込めない

#4

投稿記事 by wasawasa » 11年前

>>みけCATさん
返信ありがとうございます。改行って\nだけじゃなくて\rと\nの2文字で成り立っていたんですね……知りませんでした。
なので117行目を下記のように書き換えたら上手くいきました。ありがとうございます。

コード:

            if(text[i]==',' || text[i]=='\n' || text[i]=='\r'){
				if(i==0){i=-1;continue;}
				else{textc[i]='\0';break;}
			}

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

Re: 特定の箇所だけ画像が読み込めない

#5

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

wasawasa さんが書きました:改行って\nだけじゃなくて\rと\nの2文字で成り立っていたんですね……知りませんでした。
ファイルによって、改行を\r\nで表しているものも\nだけで表しているものもあります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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