構造体で画像データなどの管理

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

構造体で画像データなどの管理

#1

投稿記事 by Loki » 7年前

環境:Visual C++ 2010
DXライブラリを使っています。
現在、以下のように構造体にデータを代入しています。

コード:

#include "DxLib.h"
#define FAILURE				-1
#define IMAGE_LENGTH		6
#define POP_LENGTH			7
#define CHARACTER_LENGTH	5
#define EFFECT_LENGTH		4
#define MUSIC_LENGTH		1
struct DATA {
	int image[IMAGE_LENGTH], pop[POP_LENGTH], character[CHARACTER_LENGTH], effect[EFFECT_LENGTH], music[MUSIC_LENGTH];
} data;
bool titleの関数(void){
	imageを使う。
	return false;
}
bool 他の関数(void){
	imageを使う。
	return false;
}
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int){
	if(DxLib_Init()==FAILURE){
		return FAILURE;
	}
	data.image[0]=LoadGraph("a.png");
	data.image[1]=LoadGraph("b.png");
	data.image[2]=LoadGraph("c.png");
	data.image[3]=LoadGraph("d.png");
	data.image[4]=LoadGraph("e.png");
	data.image[5]=LoadGraph("f.png");
	//省略
	data.music[0]=LoadSoundMem("title.ogg");
	for(int i=0;i<IMAGE_LENGTH;i++){
		if(data.image[i]==FAILURE){
			DxLib_End();
			return FAILURE;
		}
	}
	//省略
	for(int i=0;i<MUSIC_LENGTH;i++){
		if(data.music[i]==FAILURE){
			DxLib_End();
			return FAILURE;
		}
	}
	bool end=false;
	while(略){
		switch(モード){
		case titleモード:
			end=titleの関数();
			break;
		case 他のモード:
			end=他の関数();
			break;
		default:
			end=true;
			break;
		}
		if(end){
			break;
		}
	}
	return DxLib_End();
}
①要素数が増えたときに、宣言部の要素数も変えなければならないのをなくしたいです。
構造体でなければ、

コード:

const char int[]={9,15,22,25,78}
と出来るのですが、構造体だと出来ません。

②data.image[0]=...;data.image[1]=...; と長々書くのが嫌だったので、DxLib_Init()を呼んだ後、whileの前に、

コード:

const struct{
	const int image[IMAGE_LENGTH],pop[POP_LENGTH],character[CHARACTER_LENGTH],effect[EFFECT_LENGTH],music[MUSIC_LENGTH]
}data={
	{
		LoadGraph("a.png"),
		LoadGraph("b.png")
		//略
	},
	{},{},{},
	//略
	{
		LoadSoundMem("title.ogg");
	}
};
を追加しましたが、他関数で使えないことに気が付き断念。

希望の形は次のような感じです。(①+②+変更不可)

コード:

const struct{
	const int image[]={
		LoadGraph("a.png"),
		LoadGraph("b.png"),
		//略
	},
	//略
	music[]={
		LoadSoundMem("title.ogg");
	}
}data;
実際こうかけたらいいのですが、まず、DxLib_Initを呼ぶ前にLoadGraphやLoadSoundMemは使えませんし、そもそもこの書き方自体が出来ません。
このような楽な書き方ができ、 data.image[0] という感じで使用できるものはないでしょうか。

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

Re: 構造体で画像データなどの管理

#2

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

工夫をすれば自動的に読み込んだりして狙ったことは出来ると思います。

例えば、
char *imageName[IMAGE_LENGTH];
などと定義して、このように初期化します。

コード:

struct DATA {
	char *imageFile[IMAGE_LENGTH];
	char *mugicFile[MUSIC_LENGTH];
    int image[IMAGE_LENGTH], pop[POP_LENGTH], character[CHARACTER_LENGTH], effect[EFFECT_LENGTH], music[MUSIC_LENGTH];
} data = {
	{"a.png","b.png","c.png","d.png","e.png","f.png"},
	{"title.ogg"}
};
あとはDxLib_Init()の後でファイル名の数だけループ処理でロードしてやるだけです。

ただ、全部のデータ一箇所に集める設計は後々のことを考えて止めておくほうが良いと思いますよ。

「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/
d.1 メイン関数の作り方
d.2 複数のファイルにわけてコンパイルする
d.3 ゲームの設計と分割コンパイル(1)
d.4 ゲームの設計と分割コンパイル(2)
d.5 ゲームの設計と分割コンパイル(3)
d.6 管理部の作り方 (似た要素のまとめ方)
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

Loki
記事: 22
登録日時: 7年前

Re: 構造体で画像データなどの管理

#3

投稿記事 by Loki » 7年前

実際は分割コンパイルをしているのですが、楽にできるのかな、と思って質問させていただきました。
文字列を変数に代入し、ループで楽出来る方法をご提示いただき、大変助かりました。
ありがとうございました。

閉鎖

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