DxLibで複数の行のファイル読み込み

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

DxLibで複数の行のファイル読み込み

#1

投稿記事 by jyony » 13年前

こんにちは。現在DxLibでマリオみたいな横スクロールのゲームを制作中です。

バイナリファイルを読み込んで、それでマップを作ろうかと思っています。

そこで、ファイル読み込み関数で、「FileRead_gets」を使って、ファイルを読み込みを行っているのですが、
この関数だと一行だけしか読み込めず、ループを使って読み込ませても、char変数が上書きされてしまいます。

一応、縦48行、横64行のバイナリを読み込もうと思っているのですが、複数の行を読み込ませる方法はありませんか?

自分なりに調べてもそれらしきものが見当たらず、困っております。

アドバイスの方、よろしくお願いします。

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

Re: DxLibで複数の行のファイル読み込み

#2

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

まず、読み込もうとしているファイルは本当にバイナリファイルですか?
バイナリファイルに対し「一行だけ」とか「縦48行、横64行」とか「複数の行」とかいう表現はあまり使いません。
とりあえず、読み込もうとしているファイルのサンプルをAxfc Uploaderなどにアップロードしてください。
オフトピック
テキストファイルも広義のバイナリファイルですが。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

jyony

Re: DxLibで複数の行のファイル読み込み

#3

投稿記事 by jyony » 13年前

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


一応、バイナリファイルをアップロードしました。

http://www1.axfc.net/uploader/File/so/81312
*こちらです。


キーワードは「バイナリ」です。

バイナリファイルの中で「0」がマップでいう「何もない」所で、「1」がブロックを表しています。


また何かご不明な点がありましたらご指摘願います。

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

Re: DxLibで複数の行のファイル読み込み

#4

投稿記事 by nil » 13年前

これはバイナリではなくただのテキストファイルです。
[追記]
文字コードの範囲などを考慮せずに作成されたファイル。
文字のみで構成されるテキストファイル以外はすべてこれに含まれる。
テキストファイルで使用できない制御コードなどを含むため、テキストエディタでまともに読むことはできない。
e-Worldsより抜粋一部省略
jyonyさんのアップなさったファイルはこの定義を満たしません。
最後に編集したユーザー nil on 2012年7月15日(日) 14:59 [ 編集 1 回目 ]

jyony

Re: DxLibで複数の行のファイル読み込み

#5

投稿記事 by jyony » 13年前

そうでしたかw。


確かにバイナリ形式に変換してなかったのでテキストの状態でした。

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

Re: DxLibで複数の行のファイル読み込み

#6

投稿記事 by nil » 13年前

ではバイナリ形式に変換したものをアップしてください。
また、丸投げは禁止です。フォーラムルールにある通り、
jyonyさんの組んだコードを提示してください。

お聞きしますがお使いのバイナリエディタは何ですか?

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

Re: DxLibで複数の行のファイル読み込み

#7

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

テキストファイルなのでFileRead_getsで問題なく読み込まれるはずです。
なので、何が問題なのか最初の質問に戻るわけですが問題が再現するソースコードを掲載してもらうのが一番早道ですのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#8

投稿記事 by jyony » 13年前

ソースコードのURLです。

http://www1.axfc.net/uploader/File/so/81313

キーワードは「ソースコード」です。


すみません、バイナリ形式は完成したらその後で変換しようと思っていたんでエディタも持っていません。
ゲーム制作に関しては素人なんでアホな点が多くてすみません。
一応、バイナリエディタを探して今から変換します。

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

Re: DxLibで複数の行のファイル読み込み

#9

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

バイナリエディタでマップを管理する必要性をあまり感じませんがテキストではダメなのですか?
【補足】なんとなくと言う理由ならバイナリファイルの必要性を感じてからで良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#10

投稿記事 by jyony » 13年前

>>softya(ソフト屋) さん


テキストでも全然大丈夫ですw。

というよりも、先に完成することを目標にしているので、ただ問題は複数の行を変数に上書きされずに
格納するか、です。



・・・・・分かりずらい説明ですみません。

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

Re: DxLibで複数の行のファイル読み込み

#11

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

マップの広さは固定で良いのでしょうか?
固定で良いのならcharの2次元配列にして、iで添字を切り替えてFileRead_getsしていくことで可能です。
ちなみにFileRead_getsで読み込むのは文字列になるのでナル文字の分も考慮して配列宣言して下さい。

【補足】
問題点を書いていませんでしたが、問題点は48回同じ場所に読み込んでいるので残るのは最後に読み込んだ行の情報です。

コード:

void load()
{
	file_h = FileRead_open("maps/map1.txt");

	for(int i=0;i<48;i++)
	{
		FileRead_gets(string, 3072, file_h);	←	毎回stringの先頭から読み込まれる。
	}
	FileRead_close(file_h);

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

jyony

Re: DxLibで複数の行のファイル読み込み

#12

投稿記事 by jyony » 13年前

固定かどうかはまだ決まっていませんw。

それと、コードのほうですが、以下のようでしょうか?

コード:


void load()
{

	file_h = FileRead_open("maps/map1.txt");

	for(int i=0;i<48;i++)
	{
		for(int j=0;j<65;j++)
		{
			FileRead_gets(string[j][i], 64, file_h);
			
		}

	}

	FileRead_close(file_h);

	

}

実行しても「整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。」
みたいなのが出て出来ません。

アドバイスの方、よろしくお願いします。

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

Re: DxLibで複数の行のファイル読み込み

#13

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

文字列と配列の関係を理解されていますでしょうか?
文字列は一次元の配列と考えて下さい。string[j]でアクセスされるのは文字列ではなく文字です。あとiとjの関係も間違っています。
それとstringの宣言がありませんがナル文字の分はちゃんと考慮しましたか?

マップサイズが固定されない場合は、マップサイズをテキストに含める必要性とmallocなどでメモリ確保の必要があると思います。
あるいは絶対に収まるサイズを宣言して置くかです。400(横)x100(縦)など。

【おまけ】
コードにはstringからmap配列への変換が見当たりませんので、それも問題です。
load()関数内で変換するならstringは予想横幅最大長+ナル文字の1次元配列で事足ります。
string読み込み → map変換
を繰り返すだけですからね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#14

投稿記事 by jyony » 13年前

すみません、FileRead_getsの第一引数の変数では配列とか扱えないのですか?



「整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。」
というエラーが出て配列が扱えません。

コード:

for(int i=0;i<48;i++)
	{
		FileRead_gets(string[i], 65, file_h);
		
			

	}

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

Re: DxLibで複数の行のファイル読み込み

#15

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

1次元配列は引数に出来ます。
FileRead_gets(a, 65, file_h);

2次元配列なら1つ添字が必要です。
FileRead_gets(b, 65, file_h);
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#16

投稿記事 by jyony » 13年前

そうなんですか!?


ありがとうございます。それを元にコードを組んでみたのですが、こういうことでしょうか。

コード:


void load()
{

	file_h = FileRead_open("maps/map1.txt");

	for(int i=0;i<48;i++)
	{
		for(int j=0;j<64;j++)
		{
		
			FileRead_gets(string[i], 65, file_h);
	
			maps[j][i] = string[j][i];
		}
	}

	for(int i=0;i<48;i++)
	{
		for(int j=0;j<64;j++)
		{
			DrawString(10, 10, maps[j][i], white);

		}
	}

	FileRead_close(file_h);

	

}


ただ、これだと「DrawString」のところで「DrawString' : 3 番目の引数を 'int' から 'const TCHAR *' に変換できません。」というエラーが出てしまうのですが・・・。


因みに変数mapsはint型です。


アドバイスの方、よろしくお願いします。

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

Re: DxLibで複数の行のファイル読み込み

#17

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

maps[j]はint型ですからDrawStringできません。文字列じゃないですから。
あとmaps[j] = string[j];で文字型からint型に代入してますが、文字の'0','1','2'と数値の,0,1,2は変換が必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#18

投稿記事 by jyony » 13年前

すみません、char型からint型への変換を探してるのですが、具体的には場合によってはそのままint型をchar型に代入しても勝手に
処理してくれる、というような説明があったのですが、この場合、特別な処理を施す必要はあるのでしょうか?


もしあるとすればどのような感じで処理をするのかご教授願います。

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

Re: DxLibで複数の行のファイル読み込み

#19

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

>すみません、char型からint型への変換を探してるのですが、具体的には場合によってはそのままint型をchar型に代入しても勝手に
>処理してくれる、というような説明があったのですが、この場合、特別な処理を施す必要はあるのでしょうか?

数値データであればそのとおりです。
文字データも数値データの一種ですが文字コードにより値が変わります。
shift-jis文字コードの場合は数値データ48が文字データ'0'と同じです。
なので、あのまま代入すると48('0')か49('1')がint型に代入されます。
それは意図と違いますよね?

エラーチェックも兼ねるのなら、switch~case で書いたほうが素直です。

コード:

switch(string[j][i]){
case '0':
	maps[j][i] = 0;
	break;
以下続く。

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

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

Re: DxLibで複数の行のファイル読み込み

#20

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

softya(ソフト屋) さんが書きました:エラーチェックも兼ねるのなら、switch~case で書いたほうが素直です。

コード:

switch(string[j][i]){
case '0':
	maps[j][i] = 0;
	break;
以下続く。

default:
	エラー処理
	break;
}
一般的なWindows環境ならこれでいいのではないでしょうか?

コード:

if(string[j][i]>='0' && string[j][i]<='9') {
    maps[j][i]=string[j][i]-'0';
} else {
    エラー処理
}
オフトピック
「素直」は「愚直」という意味かな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

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

Re: DxLibで複数の行のファイル読み込み

#21

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

みけCAT さんが書きました:
softya(ソフト屋) さんが書きました:エラーチェックも兼ねるのなら、switch~case で書いたほうが素直です。

コード:

switch(string[j][i]){
case '0':
	maps[j][i] = 0;
	break;
以下続く。

default:
	エラー処理
	break;
}
一般的なWindows環境ならこれでいいのではないでしょうか?

コード:

if(string[j][i]>='0' && string[j][i]<='9') {
    maps[j][i]=string[j][i]-'0';
} else {
    エラー処理
}
オフトピック
「素直」は「愚直」という意味かな?
一応0,1,5以外はエラーにしたいとかマップを0,1,Aとかした場合も考慮しました。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#22

投稿記事 by jyony » 13年前

おお、その発想は無かったですw。


ありがとうございます!
おかげで少し進歩しました。


ただ、ブロックが表示したのはいいのですが、テキストの通りに表示しなくなってしまいました。

一応、load関数は以下の通りに記述しました。

コード:


void load()
{

	file_h = FileRead_open("maps/map1.txt");

	for(int i=0;i<48;i++)
	{
		for(int j=0;j<65;j++)
		{
		
			FileRead_gets(string[i], 64, file_h);
	
			switch(string[j][i])
			{
			case'0':
				maps[j][i] = 0;
				break ;

			case'1':
				maps[j][i] = 1;
				break ;

			case'2':
				maps[j][i] = 2;
				break ;

			default:
				//エラー処理
				break ;


			}

		}
	}

	

	FileRead_close(file_h);

	

}

このようにしました。

それで、描画の方のコードなんですが、

コード:


void paint()
{
	//背景を青で埋める
	DrawBox(0,0,640,480,blue,true);
	

	for(int i=0;i<48;i++)
	{
		for(int j=0;j<65;j++)
		{
			//load関数で読み込んだmapsの中に1があればブロックの描画
			if(maps[j][i] == 1)
			{

				DrawGraph(gro1_x[j],460,gro_1,true);

			}
			//2があれば別のブロックの描画
			if(maps[j][i] == 2)
			{
				DrawGraph(j*10,i*10,block_1,false);

			}
		}
	}

}

このようにして、表示したのは一番下に2個ブロックが表示しただけでした。

http://www1.axfc.net/uploader/File/so/81322
*問題の画像です。

キーワードは「ブロック」です


よろしくお願いします。

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

Re: DxLibで複数の行のファイル読み込み

#23

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

プログラムの変数名のせいで混乱しているようです。
混乱しないように書くのもプログラミング・テクニックですので変数名に気を配って下さいね。

コード:

void load()
{
 
    file_h = FileRead_open("maps/map1.txt");
 
    for(int i=0;i<48;i++)
    {
        for(int j=0;j<65;j++)	←	読み込むのは48行だけです。なので、FileRead_getsの位置が変です。48x65回も読み込みません。
        {
        
            FileRead_gets(string[i], 64, file_h); ← 直mapsに変換するなら48行分を保存する必要はないですよ。一行分でOKです。
    
            switch(string[j][i])	iとjが逆です。ややこしいのでx,yにしてみましょう。つまりyはiでxはjです。その方が分りやすいはずです。
            {
            case'0':
                maps[j][i] = 0;		こっちのi,jは合っているみたいですね。混乱しないように気をつけて下さい。
                break ;
 
            case'1':
                maps[j][i] = 1;
                break ;
 
            case'2':
                maps[j][i] = 2;
                break ;
 
            default:
                //エラー処理
                break ;
 
 
            }
 
        }
    }
 
    
 
    FileRead_close(file_h);
 
    
 
}
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#24

投稿記事 by jyony » 13年前

このような感じにコードを組んでみたのですが・・・


コード:



void load()
{

	file_h = FileRead_open("maps/map1.txt");

	for(int y=0;y<48;y++)
	{

		FileRead_gets(string[y], 64, file_h);

		for(int x=0;x<64;x++)
		{
	
			switch(string[y][x])
			{
			case'0':
				maps[x][y] = 0;
				break ;

			case'1':
				maps[x][y] = 1;
				break ;

			case'2':
				maps[x][y] = 2;
				break ;

			default:
				//エラー処理
				break ;


			}

			
		}
	}	

	FileRead_close(file_h);
}

やはり改善しないばかりです・・・どこか不適切な部分ありますでしょうか。

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

Re: DxLibで複数の行のファイル読み込み

#25

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

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

jyony

Re: DxLibで複数の行のファイル読み込み

#26

投稿記事 by jyony » 13年前

長々と質問ばかりし続けてすみません。

画像が表示したのはいいのですが、何故か画像が2枚出てきてずれるんです。


それと、テキストファイルの中にある「0」と「1」との位置も変です。


http://www1.axfc.net/uploader/File/so/81324
キーワードは「位置」です。


アップロードした画像のような感じで、テキストファイルの「2」と画像のブロックの位置がおかしいです。


これはファイルの読み方がまずいのでしょうか?それとも画像のサイズの計算や座標計算がまずいのでしょうか??


よろしくお願いします。

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

Re: DxLibで複数の行のファイル読み込み

#27

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

なんか前とx方向のサイズが変わっていませんか?
FileRead_gets(string[y], 64, file_h);
の横の読み込みサイズが必要以上にあることと
maps[x]のサイズのどれかがあっていないとバグになりますよ。
問題のあるソースコードとデータの両方をみせてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#28

投稿記事 by jyony » 13年前

返信遅れてすみません。


ソースコードはこちらです。

コード:


void map_load()
{

	file_h = FileRead_open("maps/map1.txt");

	for(int y=0;y<48;y++)
	{

		FileRead_gets(string[y], 65, file_h);

		for(int x=0;x<64;x++)
		{
	
			switch(string[y][x])
			{
			case'0':
				maps[x][y] = 0;
				break ;

			case'1':
				maps[x][y] = 1;
				break ;

			case'2':
				maps[x][y] = 2;
				break ;

			default:
				//エラー処理
				break ;


			}

			
		}
	}	

	FileRead_close(file_h);

}

あの後、少し自分なりに弄ったので変なところがあるかもしれません。

画像描画関数です。

コード:


void paint()
{
	//背景を青で埋める
	DrawBox(0,0,640,480,blue,true);
	

	for(int i=0;i<48;i++)
	{
		for(int j=0;j<65;j++)
		{
			//load関数で読み込んだmapsの中に1があればブロックの描画
			if(maps[j][i] == 1)
			{

				DrawGraph(j*10,460,gro_1,true);

			}
			//2があれば別のブロックの描画
			if(maps[j][i] == 2)
			{
				DrawGraph(blk1_x[j],i*10,block_1,false);

			}
		}
	}

}

どこかバグの元があるのでしょうか・・・。

それと、mapsとstringの変数宣言の部分は、

コード:


int maps[65][48];

char string[48][65];

となっています。


あとすみません、データとはどのデータでしょうか?テキストファイルのことでしょうか?


よろしくお願いします。

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

Re: DxLibで複数の行のファイル読み込み

#29

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

paint()で値が1と2の時で表示座標計算方法が違いますがズレの原因ではないですか?
DrawGraph(j*10,460,gro_1,true); ← 水平座標が固定です。
DrawGraph(blk1_x[j],i*10,block_1,false);の[j]番目の配列がちゃんとありますか?
それと65番目まで表示してますが64では無いでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#30

投稿記事 by jyony » 13年前

画像のズレは直りました。

どうやら画像の座標配列のサイズが一致してなかったり、座標計算が間違ってたようですw。

ただ、テキストファイルの読み込みの仕方がおかしく、「0」や「1」の位置がおかしいです。
そこさえできれば、なんとかできるのですが・・・・。

コード:


void map_load()
{

	file_h = FileRead_open("maps/map1.txt");

	for(int y=0;y<48;y++)
	{

		FileRead_gets(string[y], 64, file_h);

		for(int x=0;x<64;x++)
		{
	
			switch(string[y][x])
			{
			case'0':
				maps[x][y] = 0;
				break ;

			case'1':
				maps[x][y] = 1;
				break ;

			case'2':
				maps[x][y] = 2;
				break ;

			default:
				//エラー処理
				break ;


			}

			
		}
	}	

}

やはりどこか間違えているのでしょうか・・・?


どうかよろしくお願いします。

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

Re: DxLibで複数の行のファイル読み込み

#31

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

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

jyony

Re: DxLibで複数の行のファイル読み込み

#32

投稿記事 by jyony » 13年前

確認してみました。

http://www1.axfc.net/uploader/File/so/81333

キーワードは「格納値」です。


やっぱり位置がずれてます・・・・。

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

Re: DxLibで複数の行のファイル読み込み

#33

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

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

jyony

Re: DxLibで複数の行のファイル読み込み

#34

投稿記事 by jyony » 13年前

試しに画像の大きさを20×20から10×10に変更してみたところ、
多少ましになりました。



やはりサイズを考慮した上で座標計算する必要があるのでしょうか?

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

Re: DxLibで複数の行のファイル読み込み

#35

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

jyony さんが書きました:試しに画像の大きさを20×20から10×10に変更してみたところ、
多少ましになりました。

やはりサイズを考慮した上で座標計算する必要があるのでしょうか?
いえ、なにか根本的に間違っています。
表示の時もDrawGraph(j*10,i*10,gro_1,true);程度のシンプルなモノで良いはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#36

投稿記事 by jyony » 13年前

やっぱりファイルの読み方に間違いがありそうだと個人的に思うのですが・・・・。


横一列に読み込んだやつがちゃんとmapsに入っているか、あるいはへんな並び方になっていないか、とか。

mapsにはテキストファイルと同じ形で代入されるんですよね?

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

Re: DxLibで複数の行のファイル読み込み

#37

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

jyony さんが書きました:やっぱりファイルの読み方に間違いがありそうだと個人的に思うのですが・・・・。


横一列に読み込んだやつがちゃんとmapsに入っているか、あるいはへんな並び方になっていないか、とか。

mapsにはテキストファイルと同じ形で代入されるんですよね?
最新のマップデータを頂けませんか?
こちらで検証してみます。
プログラムは最後に掲載されたやつで良いですよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#38

投稿記事 by jyony » 13年前

すみません、うまくいきましたw。


やはりファイルの読み込みが甘かったようです。

コード:



void map_load()
{

	file_h = FileRead_open("maps/map1.txt");

	for(int y=0;y<48;y++)
	{

		FileRead_gets(string[y], 67, file_h);     //←第二引数を67にしたらうまくいった

		for(int x=0;x<64;x++)
		{
	
			switch(string[y][x])
			{
			case'0':
				maps[y][x] = 0;
				break ;

			case'1':
				maps[y][x] = 1;
				break ;

			case'2':
				maps[y][x] = 2;
				
				break ;

			default:
				//エラー処理
				//printfDx("%d",string[y][x]);
				break ;


			}

			
		}	
	}	

}

つまり、終端の文字のヌル文字も考慮すると、3文字分サイズを大きくしておかないといけなかったのでしょうか?


とにかくうまくいったので、ありがとうございました!!

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

Re: DxLibで複数の行のファイル読み込み

#39

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

そうなると、FileRead_gets()で改行コードを読み込んでるんでしょうね。
ナル文字をあわせて\r\n\0の3文字文です。
日頃FileRead_getsを使わないのでこちらも失礼しました。

バッファを余分なサイズ分を見込んで大きめにとっておくと良いと思います。100とか。
あとstringは1次元配列にできますので考えてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

jyony

Re: DxLibで複数の行のファイル読み込み

#40

投稿記事 by jyony » 13年前

いえいえ、こちらこそ長々と質問ばかりですみませんでした。

また何かありましたらご質問させてもらいますね。

ありがとうございました!

閉鎖

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