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

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

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

#1

投稿記事 by aaaaaa » 12年前

画像ファイルの読み込みを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" ) ;
~省略~
コードはこんな感じです。いちいちテーブルの添え字を指定して入力するのが面倒くさいので何か方法はありませんか?

赤鬼
記事: 58
登録日時: 13年前

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

#2

投稿記事 by 赤鬼 » 12年前

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をお薦めします。

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

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

#3

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

FindNextFileなどのディレクトリ操作法はDXライブラリのアーカイブだと特殊な処理が必要なのでアーカイブ化する予定ならオススメできません。
FindNextFileでディレクトリ・リストを作成するツールを別に作って結果をファイル出力。そのファイルの情報を元に読み込むようにするのはどうでしょうか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

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

#4

投稿記事 by ISLe » 12年前

こんなふうにすればファイル名(の文字列)をいじるだけですが。

コード:

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]);
}
ディレクトリを走査すると順番を把握するのが面倒になるのでは?

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

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

#5

投稿記事 by Dixq (管理人) » 12年前

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

赤鬼
記事: 58
登録日時: 13年前

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

#6

投稿記事 by 赤鬼 » 12年前

ISLe さんが書きました:ディレクトリを走査すると順番を把握するのが面倒になるのでは?
ああっ、そうでした!すみません。
ISleさんのコードの方が遥にいいですね。オーバーフロー対策的にも。

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

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

#7

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

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

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

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

※1 enumを自動定義するためにはファイル名から作るので英字であることが望ましいです。環境次第で日本語でも出来ないことはないですが。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

aaaaaa

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

#8

投稿記事 by aaaaaa » 12年前

結局うまくいかなかったので別の掲示板で質問してみます

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

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

#9

投稿記事 by Dixq (管理人) » 12年前

うまくいかなかったとのことですが、どううまくいかなかったのですか?
皆さんが書いてくださった回答に対して全くレスがありませんが
ほかの掲示板に頼る前に分からないことを解決していかないと、同じことの繰り返しではないでしょうか。

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

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

#10

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

続きはこちらにあります。
「画像ファイル自動読み込み」
http://hpcgi2.nifty.com/natupaji/bbs/pa ... ew&no=2834
まぁ、赤鬼さんの提案と同じようにすると言う方向になっているわけですが、こっちで言っていた問題は残ったままです。
色々提案されてわけが分からなくなったって所でしょうか。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 15年前
住所: 北海道札幌市
連絡を取る:

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

#11

投稿記事 by Dixq (管理人) » 12年前

> softyaさん

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

naohiro19
記事: 256
登録日時: 15年前
住所: 愛知県

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

#12

投稿記事 by naohiro19 » 12年前

エクセルを使ってファイルパスを記述しておいて読み込む方法もありますね

閉鎖

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