DxLibで複数の行のファイル読み込み
-
jyony
DxLibで複数の行のファイル読み込み
こんにちは。現在DxLibでマリオみたいな横スクロールのゲームを制作中です。
バイナリファイルを読み込んで、それでマップを作ろうかと思っています。
そこで、ファイル読み込み関数で、「FileRead_gets」を使って、ファイルを読み込みを行っているのですが、
この関数だと一行だけしか読み込めず、ループを使って読み込ませても、char変数が上書きされてしまいます。
一応、縦48行、横64行のバイナリを読み込もうと思っているのですが、複数の行を読み込ませる方法はありませんか?
自分なりに調べてもそれらしきものが見当たらず、困っております。
アドバイスの方、よろしくお願いします。
バイナリファイルを読み込んで、それでマップを作ろうかと思っています。
そこで、ファイル読み込み関数で、「FileRead_gets」を使って、ファイルを読み込みを行っているのですが、
この関数だと一行だけしか読み込めず、ループを使って読み込ませても、char変数が上書きされてしまいます。
一応、縦48行、横64行のバイナリを読み込もうと思っているのですが、複数の行を読み込ませる方法はありませんか?
自分なりに調べてもそれらしきものが見当たらず、困っております。
アドバイスの方、よろしくお願いします。
Re: DxLibで複数の行のファイル読み込み
まず、読み込もうとしているファイルは本当にバイナリファイルですか?
バイナリファイルに対し「一行だけ」とか「縦48行、横64行」とか「複数の行」とかいう表現はあまり使いません。
とりあえず、読み込もうとしているファイルのサンプルをAxfc Uploaderなどにアップロードしてください。
バイナリファイルに対し「一行だけ」とか「縦48行、横64行」とか「複数の行」とかいう表現はあまり使いません。
とりあえず、読み込もうとしているファイルのサンプルをAxfc Uploaderなどにアップロードしてください。
オフトピック
テキストファイルも広義のバイナリファイルですが。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
jyony
Re: DxLibで複数の行のファイル読み込み
早速のご回答ありがとうございます。
一応、バイナリファイルをアップロードしました。
http://www1.axfc.net/uploader/File/so/81312
*こちらです。
キーワードは「バイナリ」です。
バイナリファイルの中で「0」がマップでいう「何もない」所で、「1」がブロックを表しています。
また何かご不明な点がありましたらご指摘願います。
一応、バイナリファイルをアップロードしました。
http://www1.axfc.net/uploader/File/so/81312
*こちらです。
キーワードは「バイナリ」です。
バイナリファイルの中で「0」がマップでいう「何もない」所で、「1」がブロックを表しています。
また何かご不明な点がありましたらご指摘願います。
Re: DxLibで複数の行のファイル読み込み
ではバイナリ形式に変換したものをアップしてください。
また、丸投げは禁止です。フォーラムルールにある通り、
jyonyさんの組んだコードを提示してください。
お聞きしますがお使いのバイナリエディタは何ですか?
また、丸投げは禁止です。フォーラムルールにある通り、
jyonyさんの組んだコードを提示してください。
お聞きしますがお使いのバイナリエディタは何ですか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
テキストファイルなのでFileRead_getsで問題なく読み込まれるはずです。
なので、何が問題なのか最初の質問に戻るわけですが問題が再現するソースコードを掲載してもらうのが一番早道ですのでお願いします。
なので、何が問題なのか最初の質問に戻るわけですが問題が再現するソースコードを掲載してもらうのが一番早道ですのでお願いします。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
ソースコードのURLです。
http://www1.axfc.net/uploader/File/so/81313
キーワードは「ソースコード」です。
すみません、バイナリ形式は完成したらその後で変換しようと思っていたんでエディタも持っていません。
ゲーム制作に関しては素人なんでアホな点が多くてすみません。
一応、バイナリエディタを探して今から変換します。
http://www1.axfc.net/uploader/File/so/81313
キーワードは「ソースコード」です。
すみません、バイナリ形式は完成したらその後で変換しようと思っていたんでエディタも持っていません。
ゲーム制作に関しては素人なんでアホな点が多くてすみません。
一応、バイナリエディタを探して今から変換します。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
バイナリエディタでマップを管理する必要性をあまり感じませんがテキストではダメなのですか?
【補足】なんとなくと言う理由ならバイナリファイルの必要性を感じてからで良いと思います。
【補足】なんとなくと言う理由ならバイナリファイルの必要性を感じてからで良いと思います。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
>>softya(ソフト屋) さん
テキストでも全然大丈夫ですw。
というよりも、先に完成することを目標にしているので、ただ問題は複数の行を変数に上書きされずに
格納するか、です。
・・・・・分かりずらい説明ですみません。
テキストでも全然大丈夫ですw。
というよりも、先に完成することを目標にしているので、ただ問題は複数の行を変数に上書きされずに
格納するか、です。
・・・・・分かりずらい説明ですみません。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
マップの広さは固定で良いのでしょうか?
固定で良いのならcharの2次元配列にして、iで添字を切り替えてFileRead_getsしていくことで可能です。
ちなみにFileRead_getsで読み込むのは文字列になるのでナル文字の分も考慮して配列宣言して下さい。
【補足】
問題点を書いていませんでしたが、問題点は48回同じ場所に読み込んでいるので残るのは最後に読み込んだ行の情報です。
固定で良いのならcharの2次元配列にして、iで添字を切り替えてFileRead_getsしていくことで可能です。
ちなみにFileRead_getsで読み込むのは文字列になるのでナル文字の分も考慮して配列宣言して下さい。
【補足】
問題点を書いていませんでしたが、問題点は48回同じ場所に読み込んでいるので残るのは最後に読み込んだ行の情報です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
固定かどうかはまだ決まっていませんw。
それと、コードのほうですが、以下のようでしょうか?
実行しても「整数型からポインタ型への変換には reinterpret_cast、C スタイル キャストまたは関数スタイル キャストが必要です。」
みたいなのが出て出来ません。
アドバイスの方、よろしくお願いします。
それと、コードのほうですが、以下のようでしょうか?
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);
}
みたいなのが出て出来ません。
アドバイスの方、よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
文字列と配列の関係を理解されていますでしょうか?
文字列は一次元の配列と考えて下さい。string[j]でアクセスされるのは文字列ではなく文字です。あとiとjの関係も間違っています。
それとstringの宣言がありませんがナル文字の分はちゃんと考慮しましたか?
マップサイズが固定されない場合は、マップサイズをテキストに含める必要性とmallocなどでメモリ確保の必要があると思います。
あるいは絶対に収まるサイズを宣言して置くかです。400(横)x100(縦)など。
【おまけ】
コードにはstringからmap配列への変換が見当たりませんので、それも問題です。
load()関数内で変換するならstringは予想横幅最大長+ナル文字の1次元配列で事足ります。
string読み込み → map変換
を繰り返すだけですからね。
文字列は一次元の配列と考えて下さい。string[j]でアクセスされるのは文字列ではなく文字です。あとiとjの関係も間違っています。
それとstringの宣言がありませんがナル文字の分はちゃんと考慮しましたか?
マップサイズが固定されない場合は、マップサイズをテキストに含める必要性とmallocなどでメモリ確保の必要があると思います。
あるいは絶対に収まるサイズを宣言して置くかです。400(横)x100(縦)など。
【おまけ】
コードにはstringからmap配列への変換が見当たりませんので、それも問題です。
load()関数内で変換するならstringは予想横幅最大長+ナル文字の1次元配列で事足ります。
string読み込み → map変換
を繰り返すだけですからね。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
1次元配列は引数に出来ます。
FileRead_gets(a, 65, file_h);
2次元配列なら1つ添字が必要です。
FileRead_gets(b, 65, file_h);
FileRead_gets(a, 65, file_h);
2次元配列なら1つ添字が必要です。
FileRead_gets(b, 65, file_h);
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
そうなんですか!?
ありがとうございます。それを元にコードを組んでみたのですが、こういうことでしょうか。
ただ、これだと「DrawString」のところで「DrawString' : 3 番目の引数を 'int' から 'const TCHAR *' に変換できません。」というエラーが出てしまうのですが・・・。
因みに変数mapsはint型です。
アドバイスの方、よろしくお願いします。
ありがとうございます。それを元にコードを組んでみたのですが、こういうことでしょうか。
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で複数の行のファイル読み込み
maps[j]はint型ですからDrawStringできません。文字列じゃないですから。
あとmaps[j] = string[j];で文字型からint型に代入してますが、文字の'0','1','2'と数値の,0,1,2は変換が必要です。
あとmaps[j] = string[j];で文字型からint型に代入してますが、文字の'0','1','2'と数値の,0,1,2は変換が必要です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
すみません、char型からint型への変換を探してるのですが、具体的には場合によってはそのままint型をchar型に代入しても勝手に
処理してくれる、というような説明があったのですが、この場合、特別な処理を施す必要はあるのでしょうか?
もしあるとすればどのような感じで処理をするのかご教授願います。
処理してくれる、というような説明があったのですが、この場合、特別な処理を施す必要はあるのでしょうか?
もしあるとすればどのような感じで処理をするのかご教授願います。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
>すみません、char型からint型への変換を探してるのですが、具体的には場合によってはそのままint型をchar型に代入しても勝手に
>処理してくれる、というような説明があったのですが、この場合、特別な処理を施す必要はあるのでしょうか?
数値データであればそのとおりです。
文字データも数値データの一種ですが文字コードにより値が変わります。
shift-jis文字コードの場合は数値データ48が文字データ'0'と同じです。
なので、あのまま代入すると48('0')か49('1')がint型に代入されます。
それは意図と違いますよね?
エラーチェックも兼ねるのなら、switch~case で書いたほうが素直です。
>処理してくれる、というような説明があったのですが、この場合、特別な処理を施す必要はあるのでしょうか?
数値データであればそのとおりです。
文字データも数値データの一種ですが文字コードにより値が変わります。
shift-jis文字コードの場合は数値データ48が文字データ'0'と同じです。
なので、あのまま代入すると48('0')か49('1')がint型に代入されます。
それは意図と違いますよね?
エラーチェックも兼ねるのなら、switch~case で書いたほうが素直です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: DxLibで複数の行のファイル読み込み
一般的なWindows環境ならこれでいいのではないでしょうか?
オフトピック
「素直」は「愚直」という意味かな?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
一応0,1,5以外はエラーにしたいとかマップを0,1,Aとかした場合も考慮しました。みけCAT さんが書きました:一般的なWindows環境ならこれでいいのではないでしょうか?オフトピック「素直」は「愚直」という意味かな?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
おお、その発想は無かったですw。
ありがとうございます!
おかげで少し進歩しました。
ただ、ブロックが表示したのはいいのですが、テキストの通りに表示しなくなってしまいました。
一応、load関数は以下の通りに記述しました。
このようにしました。
それで、描画の方のコードなんですが、
このようにして、表示したのは一番下に2個ブロックが表示しただけでした。
http://www1.axfc.net/uploader/File/so/81322
*問題の画像です。
キーワードは「ブロック」です
よろしくお願いします。
ありがとうございます!
おかげで少し進歩しました。
ただ、ブロックが表示したのはいいのですが、テキストの通りに表示しなくなってしまいました。
一応、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);
}
}
}
}
http://www1.axfc.net/uploader/File/so/81322
*問題の画像です。
キーワードは「ブロック」です
よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
プログラムの変数名のせいで混乱しているようです。
混乱しないように書くのもプログラミング・テクニックですので変数名に気を配って下さいね。
混乱しないように書くのもプログラミング・テクニックですので変数名に気を配って下さいね。
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で複数の行のファイル読み込み
このような感じにコードを組んでみたのですが・・・
やはり改善しないばかりです・・・どこか不適切な部分ありますでしょうか。
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で複数の行のファイル読み込み
FileRead_gets(string[y], 65, file_h);
では?
では?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
長々と質問ばかりし続けてすみません。
画像が表示したのはいいのですが、何故か画像が2枚出てきてずれるんです。
それと、テキストファイルの中にある「0」と「1」との位置も変です。
http://www1.axfc.net/uploader/File/so/81324
キーワードは「位置」です。
アップロードした画像のような感じで、テキストファイルの「2」と画像のブロックの位置がおかしいです。
これはファイルの読み方がまずいのでしょうか?それとも画像のサイズの計算や座標計算がまずいのでしょうか??
よろしくお願いします。
画像が表示したのはいいのですが、何故か画像が2枚出てきてずれるんです。
それと、テキストファイルの中にある「0」と「1」との位置も変です。
http://www1.axfc.net/uploader/File/so/81324
キーワードは「位置」です。
アップロードした画像のような感じで、テキストファイルの「2」と画像のブロックの位置がおかしいです。
これはファイルの読み方がまずいのでしょうか?それとも画像のサイズの計算や座標計算がまずいのでしょうか??
よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
なんか前とx方向のサイズが変わっていませんか?
FileRead_gets(string[y], 64, file_h);
の横の読み込みサイズが必要以上にあることと
maps[x]のサイズのどれかがあっていないとバグになりますよ。
問題のあるソースコードとデータの両方をみせてください。
FileRead_gets(string[y], 64, file_h);
の横の読み込みサイズが必要以上にあることと
maps[x]のサイズのどれかがあっていないとバグになりますよ。
問題のあるソースコードとデータの両方をみせてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
返信遅れてすみません。
ソースコードはこちらです。
あの後、少し自分なりに弄ったので変なところがあるかもしれません。
画像描画関数です。
どこかバグの元があるのでしょうか・・・。
それと、mapsとstringの変数宣言の部分は、
となっています。
あとすみません、データとはどのデータでしょうか?テキストファイルのことでしょうか?
よろしくお願いします。
ソースコードはこちらです。
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の変数宣言の部分は、
となっています。
あとすみません、データとはどのデータでしょうか?テキストファイルのことでしょうか?
よろしくお願いします。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
paint()で値が1と2の時で表示座標計算方法が違いますがズレの原因ではないですか?
DrawGraph(j*10,460,gro_1,true); ← 水平座標が固定です。
DrawGraph(blk1_x[j],i*10,block_1,false);の[j]番目の配列がちゃんとありますか?
それと65番目まで表示してますが64では無いでしょうか?
DrawGraph(j*10,460,gro_1,true); ← 水平座標が固定です。
DrawGraph(blk1_x[j],i*10,block_1,false);の[j]番目の配列がちゃんとありますか?
それと65番目まで表示してますが64では無いでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
画像のズレは直りました。
どうやら画像の座標配列のサイズが一致してなかったり、座標計算が間違ってたようですw。
ただ、テキストファイルの読み込みの仕方がおかしく、「0」や「1」の位置がおかしいです。
そこさえできれば、なんとかできるのですが・・・・。
やはりどこか間違えているのでしょうか・・・?
どうかよろしくお願いします。
どうやら画像の座標配列のサイズが一致してなかったり、座標計算が間違ってたようです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で複数の行のファイル読み込み
printfDXでmaps配列の格納値を確認してみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
Load時のstring[y]もずれているのでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
試しに画像の大きさを20×20から10×10に変更してみたところ、
多少ましになりました。
やはりサイズを考慮した上で座標計算する必要があるのでしょうか?
多少ましになりました。
やはりサイズを考慮した上で座標計算する必要があるのでしょうか?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
いえ、なにか根本的に間違っています。jyony さんが書きました:試しに画像の大きさを20×20から10×10に変更してみたところ、
多少ましになりました。
やはりサイズを考慮した上で座標計算する必要があるのでしょうか?
表示の時もDrawGraph(j*10,i*10,gro_1,true);程度のシンプルなモノで良いはずです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
やっぱりファイルの読み方に間違いがありそうだと個人的に思うのですが・・・・。
横一列に読み込んだやつがちゃんとmapsに入っているか、あるいはへんな並び方になっていないか、とか。
mapsにはテキストファイルと同じ形で代入されるんですよね?
横一列に読み込んだやつがちゃんとmapsに入っているか、あるいはへんな並び方になっていないか、とか。
mapsにはテキストファイルと同じ形で代入されるんですよね?
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
最新のマップデータを頂けませんか?jyony さんが書きました:やっぱりファイルの読み方に間違いがありそうだと個人的に思うのですが・・・・。
横一列に読み込んだやつがちゃんとmapsに入っているか、あるいはへんな並び方になっていないか、とか。
mapsにはテキストファイルと同じ形で代入されるんですよね?
こちらで検証してみます。
プログラムは最後に掲載されたやつで良いですよね?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
すみません、うまくいきましたw。
やはりファイルの読み込みが甘かったようです。
つまり、終端の文字のヌル文字も考慮すると、3文字分サイズを大きくしておかないといけなかったのでしょうか?
とにかくうまくいったので、ありがとうございました!!
やはりファイルの読み込みが甘かったようです。
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 ;
}
}
}
}
とにかくうまくいったので、ありがとうございました!!
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: DxLibで複数の行のファイル読み込み
そうなると、FileRead_gets()で改行コードを読み込んでるんでしょうね。
ナル文字をあわせて\r\n\0の3文字文です。
日頃FileRead_getsを使わないのでこちらも失礼しました。
バッファを余分なサイズ分を見込んで大きめにとっておくと良いと思います。100とか。
あとstringは1次元配列にできますので考えてみて下さい。
ナル文字をあわせて\r\n\0の3文字文です。
日頃FileRead_getsを使わないのでこちらも失礼しました。
バッファを余分なサイズ分を見込んで大きめにとっておくと良いと思います。100とか。
あとstringは1次元配列にできますので考えてみて下さい。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
-
jyony
Re: DxLibで複数の行のファイル読み込み
いえいえ、こちらこそ長々と質問ばかりですみませんでした。
また何かありましたらご質問させてもらいますね。
ありがとうございました!
また何かありましたらご質問させてもらいますね。
ありがとうございました!