コンストラクタでvectorを用いてのLoadGraphについて
Posted: 2015年1月31日(土) 18:35
久しぶりに質問させていただきます。
前提として、今回お尋ねしたいのは、LoadGraph(LoadDivGraph)を用いて読み込んだ画像はDxライブラリ終了時までアドレスに記憶されるのか、ということです。
現在簡単なシューティングゲームを作っているのですが、画像をできるだけわかりやすく管理したいと思い、vectorを用いて画像のハンドルを保存することにしました。
基本的な物体をChara_Objとして、 として、画像データを持つvectorを持たせ、また別のヘッダに、
画像情報を格納するオブジェクトとして:Graphic_Data、
実際に読みこんだ画像を保存しておくオブジェクトとして GraphData_Objをつくりました。
その後、ゲーム全体を管理するGame_ObjにGraphData_Obj* Graph を置き、Game_Objのコンストラクタで
GraphData_Obj* Graph = new GraphData_Obj;
としてインスタンスを生成してやりました。
その後、Game_Obj内のその他のオブジェクトがGraphのアドレスを持つようにして、どのクラスからでも画像データにアクセスしやすくしました。
しかし、あとでほかのクラスから画像情報(vector)をもらい描画しようとしても、表示されません。
デバッグをしてみたところ、LoadGraphで得たvectorのデータ(intのハンドル)をもらうことには成功しているようなのです。
色々試行錯誤してみたのですが、どうにも理由がわかりません。
お知恵を貸していただければありがたいです。
前提として、今回お尋ねしたいのは、LoadGraph(LoadDivGraph)を用いて読み込んだ画像はDxライブラリ終了時までアドレスに記憶されるのか、ということです。
現在簡単なシューティングゲームを作っているのですが、画像をできるだけわかりやすく管理したいと思い、vectorを用いて画像のハンドルを保存することにしました。
基本的な物体をChara_Objとして、 として、画像データを持つvectorを持たせ、また別のヘッダに、
画像情報を格納するオブジェクトとして:Graphic_Data、
実際に読みこんだ画像を保存しておくオブジェクトとして GraphData_Objをつくりました。
class Graphic_data
{
public:
vector<int> graph;
int width, height;
Graphic_data(char* name){
// 読み込みに使う変数
int X_num, Y_num = 1, Allnum;
int handle;
//一枚画像読み込み
handle = LoadGraph(name, 0);
//大きさから枚数を調べる 枚数分int領域確保
GetGraphSize(handle, &width, &height);
if (width % height == 0){
X_num = Allnum = width / height;
int num[20] = { 0 };
// LoadDivGraphで枚数を分けて確保したint領域に読み込み その後vectorに入れていく
LoadDivGraph(name, Allnum, X_num, Y_num, width, height, num, 0);
for (int i = 0; i < Allnum; i++){
graph.push_back(num[i]);
}
width = height;
}
else{
graph.push_back(handle);
}
}
};
class GraphData_Obj{
public:
/*ほしい画像データ列挙*/
map<string, Graphic_data*> Menu;
vector<Graphic_data*> Player;
vector<Graphic_data*> Enemy;
vector<Graphic_data*> Effect;
GraphData_Obj(){
///////////////////////////////////////////
/*--------- 画像データ読み込み -----------*/
///////////////////////////////////////////
// 読み込みに使うファイル名変数
char adress[256];
/* 自機の画像読み込み */
for (int i = 0;; i++){
sprintf_s(adress, "Image/Player/%d.png", i);
if ((LoadGraph(adress)) == -1)break;
Graphic_data* tmp = new Graphic_data(adress);
Player.push_back(tmp);
}
/* 敵の画像読み込み */
for (int i = 0;;i++){
sprintf_s(adress, "Image/Enemy/%d.png", i);
if (( LoadGraph(adress)) == -1)break;
Graphic_data* tmp = new Graphic_data(adress);
Enemy.push_back(tmp);
}
/* 敵の弾画像読み込み */
for (int i = 0;; i++){
sprintf_s(adress, "Image/Enemy/Bullet/%d", i);
if (( LoadGraph(adress)) == -1)break;
Graphic_data* tmp = new Graphic_data(adress);
Enemy.push_back(tmp);
}
/* メニューの画像読み込み */
Menu["BackGround1"] = GetMapAdress("Image/Menu/BackGround.png");
Menu["BackGround2"] = GetMapAdress("Image/Menu/BackGround1.png");
char name[256];
for (int i = 0;; i++){
sprintf_s(adress, "Image/Menu/StageGraph/%d.png", i);
if (LoadGraph(adress) == -1)break;
sprintf_s(name, "StageGraph%d", i);
Menu[name] = GetMapAdress(adress);
}
}
// Mapを用いたコンテナに画像を登録するための関数(アドレスをすぐに返すため一行で登録が可能)
Graphic_data* GetMapAdress(string data_address){
char name[256];
sprintf_s(name, data_address.c_str());
Graphic_data* tmp = new Graphic_data(name);
return tmp;
}
};
class String_Obj{
public:
string str;
int x, y,width,height, size;
int num;
int color;
String_Obj(int point_x,int point_y,string data, int DrawSize, int DrawColor){
x = point_x;
y = point_y;
str = data;
size = DrawSize;
num = str.size();
width = size * num;
height = size;
color = DrawColor;
}
void Draw(){
int NowSize = GetFontSize();
SetFontSize(size);
DrawFormatString(x - width / 2,y - height / 2,color,str.c_str());
}
};
GraphData_Obj* Graph = new GraphData_Obj;
としてインスタンスを生成してやりました。
その後、Game_Obj内のその他のオブジェクトがGraphのアドレスを持つようにして、どのクラスからでも画像データにアクセスしやすくしました。
しかし、あとでほかのクラスから画像情報(vector)をもらい描画しようとしても、表示されません。
デバッグをしてみたところ、LoadGraphで得たvectorのデータ(intのハンドル)をもらうことには成功しているようなのです。
色々試行錯誤してみたのですが、どうにも理由がわかりません。
お知恵を貸していただければありがたいです。