ページ 11

画像ファイルの読み込みについて

Posted: 2012年10月17日(水) 09:52
by aaaaaa
画像ファイルの読み込みをLoadGraph関数を使って、ひとつずつ行っていますが、ファイルの数が増えてくるといちいち入力するのが面倒くさくて、大変です。「このフォルダ内のpngファイルを読み込む」といった具合に自動化できませんか?

コード:

#include "DxLib.h"
#include <math.h>
~省略~
GTable[0] = LoadGraph( "画像/いぬ.png" ) ;
	GTable[1] = LoadGraph( "画像/うさぎ.png" ) ;
	GTable[2] = LoadGraph( "画像/うし.png" ) ;
	GTable[3] = LoadGraph( "画像/おとこのこ.png" ) ;
	GTable[4] = LoadGraph( "画像/おんなのこ.png" ) ;
	GTable[5] = LoadGraph( "画像/かえる.png" ) ;
	GTable[6] = LoadGraph( "画像/かに.png" ) ;
	GTable[7] = LoadGraph( "画像/きりん.png" ) ;
	GTable[8] = LoadGraph( "画像/さかな.png" ) ;
	GTable[9] = LoadGraph( "画像/ちょうちょ.png" ) ;
	GTable[10] = LoadGraph( "画像/ねこ.png" ) ;
	GTable[11] = LoadGraph( "画像/ねずみ.png" ) ;
	GTable[12] = LoadGraph( "画像/はち.png" ) ;
	GTable[13] = LoadGraph( "画像/はと.png" ) ;
	GTable[14] = LoadGraph( "画像/ぶた.png" ) ;
	GTable[15] = LoadGraph( "画像/みのむし.png" ) ;
	GTable[16] = LoadGraph( "画像/らいおん.png" ) ;
~省略~
コードはこんな感じです。いちいちテーブルの添え字を指定して入力するのが面倒くさいので何か方法はありませんか?

Re: 画像ファイルの読み込みについて

Posted: 2012年10月17日(水) 10:06
by 赤鬼
aaaaaa さんが書きました:画像ファイルの読み込みをLoadGraph関数を使って、ひとつずつ行っていますが、ファイルの数が増えてくるといちいち入力するのが面倒くさくて、大変です。「このフォルダ内のpngファイルを読み込む」といった具合に自動化できませんか?

コード:

#include "DxLib.h"
#include <math.h>
~省略~
GTable[0] = LoadGraph( "画像/いぬ.png" ) ;
	GTable[1] = LoadGraph( "画像/うさぎ.png" ) ;
	GTable[2] = LoadGraph( "画像/うし.png" ) ;
	GTable[3] = LoadGraph( "画像/おとこのこ.png" ) ;
	GTable[4] = LoadGraph( "画像/おんなのこ.png" ) ;
	GTable[5] = LoadGraph( "画像/かえる.png" ) ;
	GTable[6] = LoadGraph( "画像/かに.png" ) ;
	GTable[7] = LoadGraph( "画像/きりん.png" ) ;
	GTable[8] = LoadGraph( "画像/さかな.png" ) ;
	GTable[9] = LoadGraph( "画像/ちょうちょ.png" ) ;
	GTable[10] = LoadGraph( "画像/ねこ.png" ) ;
	GTable[11] = LoadGraph( "画像/ねずみ.png" ) ;
	GTable[12] = LoadGraph( "画像/はち.png" ) ;
	GTable[13] = LoadGraph( "画像/はと.png" ) ;
	GTable[14] = LoadGraph( "画像/ぶた.png" ) ;
	GTable[15] = LoadGraph( "画像/みのむし.png" ) ;
	GTable[16] = LoadGraph( "画像/らいおん.png" ) ;
~省略~
コードはこんな感じです。いちいちテーブルの添え字を指定して入力するのが面倒くさいので何か方法はありませんか?
画像のサイズがわからないので一枚にまとめる方法はなしと考えて進めます。
比較的簡単な手法として
~.pngのところの~を数字に置き換えてsprintfなどで変えてしまう手があります。
(charの部分はstd::stringが使えるならストリングで)

コード:

	char file_name[256];
	for(int i=0;i<16;i++){				//画像ファイルの個数分
		sprintf_s(file_name,"%d.png",i);
		GTable[i] = LoadGraph( file_name ) ;
	}
追記
もう一つの手法として、ディレクトリを走査して内部にあるpngファイルを取得する方法があります。
こちらは面倒臭いので一度作ったらテンプレート化してしまうことをお薦めします。

またディレクトリ走査は久しぶり過ぎてうろ覚えですので流れだけ。
まず、API関数を使うのでご了承を。

GetCurrentDirectoryで現在のカレントディレクトリを取得し保存。
SetCurrentDirectoryでディレクトリを設定。
FindFirstFileでワイルドカードを指定。つまりこの場合"*.png"で呼び出す。
画像をロード且つ、FindNextFileでERROR_NO_MORE_FILESになるまで続ける。
終わったらFindCloseで閉じる。
カレントディレクトリを元に戻す。
こんな流れだとおもいます。

言っていることが一切わからない場合前述のsprintfをお薦めします。

Re: 画像ファイルの読み込みについて

Posted: 2012年10月17日(水) 14:55
by softya(ソフト屋)
FindNextFileなどのディレクトリ操作法はDXライブラリのアーカイブだと特殊な処理が必要なのでアーカイブ化する予定ならオススメできません。
FindNextFileでディレクトリ・リストを作成するツールを別に作って結果をファイル出力。そのファイルの情報を元に読み込むようにするのはどうでしょうか?

Re: 画像ファイルの読み込みについて

Posted: 2012年10月17日(水) 16:46
by ISLe
こんなふうにすればファイル名(の文字列)をいじるだけですが。

コード:

static const char *filename[] = {
	"画像/いぬ.png",
	"画像/うさぎ.png",
	"画像/うし.png",
	"画像/おとこのこ.png",
	"画像/おんなのこ.png",
	"画像/かえる.png",
	"画像/かに.png",
	"画像/きりん.png",
	"画像/さかな.png",
	"画像/ちょうちょ.png",
	"画像/ねこ.png",
	"画像/ねずみ.png",
	"画像/はち.png",
	"画像/はと.png",
	"画像/ぶた.png",
	"画像/みのむし.png",
	"画像/らいおん.png",
};
int GTable[sizeof(filename)/sizeof(filename[0])];

int i;
for (i=0; i<sizeof(GTable)/sizeof(GTable[0]); i++) {
	GTable[i] = LoadGraph(filename[i]);
}
ディレクトリを走査すると順番を把握するのが面倒になるのでは?

Re: 画像ファイルの読み込みについて

Posted: 2012年10月17日(水) 19:34
by Dixq (管理人)
うちのサイトで紹介してるAerobeatというゲームは、自分で曲を追加できるので、FindFirstFileを使ってディレクトリ内の情報を取ってきています。
http://dixq.net/Aerobeat/
しかしこれは、素材の順番がどうでもいい場合に限ります。
どうでもよくない場合は、FindFirstFileを使って一括で読み込むと参照するのが大変です。
ISLeさんが書かれているような方法にするか、HashMapみたいなもので、パスと固有値とハンドルを対応付けて管理すると楽かもしれません。

Re: 画像ファイルの読み込みについて

Posted: 2012年10月17日(水) 20:09
by 赤鬼
ISLe さんが書きました:ディレクトリを走査すると順番を把握するのが面倒になるのでは?
ああっ、そうでした!すみません。
ISleさんのコードの方が遥にいいですね。オーバーフロー対策的にも。

Re: 画像ファイルの読み込みについて

Posted: 2012年10月17日(水) 20:57
by softya(ソフト屋)
softya(ソフト屋) さんが書きました:FindNextFileなどのディレクトリ操作法はDXライブラリのアーカイブだと特殊な処理が必要なのでアーカイブ化する予定ならオススメできません。
FindNextFileでディレクトリ・リストを作成するツールを別に作って結果をファイル出力。そのファイルの情報を元に読み込むようにするのはどうでしょうか?
>どうでもよくない場合は、FindFirstFileを使って一括で読み込むと参照するのが大変です。

そういうのは簡易なデータベースのようなもので出てくる順番を管理するって手がありますね。
増えた分には新しい番号が割り当てられる & 前からあるのは同じ番号のまま。

問題はこの読み込まれたテーブルが番号でしか管理できない事でしょうか。
つまりマジックナンバーでしかアクセス出来ないって方が問題だと思います。
面倒でしょうが、ISLe さんのやつに更にテーブル参照用のenumを追加するとかも手ですし、私の案で自動的にenumを定義したhファイルを作成するって手もあります(※1)。

※1 enumを自動定義するためにはファイル名から作るので英字であることが望ましいです。環境次第で日本語でも出来ないことはないですが。

Re: 画像ファイルの読み込みについて

Posted: 2012年11月12日(月) 19:24
by aaaaaa
結局うまくいかなかったので別の掲示板で質問してみます

Re: 画像ファイルの読み込みについて

Posted: 2012年11月12日(月) 23:09
by Dixq (管理人)
うまくいかなかったとのことですが、どううまくいかなかったのですか?
皆さんが書いてくださった回答に対して全くレスがありませんが
ほかの掲示板に頼る前に分からないことを解決していかないと、同じことの繰り返しではないでしょうか。

Re: 画像ファイルの読み込みについて

Posted: 2012年11月12日(月) 23:18
by softya(ソフト屋)
続きはこちらにあります。
「画像ファイル自動読み込み」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2834
まぁ、赤鬼さんの提案と同じようにすると言う方向になっているわけですが、こっちで言っていた問題は残ったままです。
色々提案されてわけが分からなくなったって所でしょうか。

Re: 画像ファイルの読み込みについて

Posted: 2012年11月13日(火) 00:20
by Dixq (管理人)
> softyaさん

なるほど、DXライブラリ本家の方を拝見しました。
・・色々返信を書いていましたが、やめました。
aaaaaaさんがフォーラムルールを理解して頂ける方なら続きを書いていただけるでしょう。
softyaさん、対応ありがとうございます。

Re: 画像ファイルの読み込みについて

Posted: 2012年11月13日(火) 09:39
by naohiro19
エクセルを使ってファイルパスを記述しておいて読み込む方法もありますね