構造体の画像が表示されない

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

構造体の画像が表示されない

#1

投稿記事 by きずなん » 14年前

現在2DRPG作成中です。

簡潔に言うと、モンスターのデータをまとめて構造体の中に入れ、その中に画像も一緒に入れてます。別のbattle.cppからそのデータを参照したのですが、画像だけ呼べません(というか表示されない。)


↓以下、詳しい質問内容です。

Extern.hでまずモンスターデータの構造体の格納先をextern宣言してます。
その部分だけになりますが、これです。

コード:

// -----------------------------------------------
//       Extern.h
//------------------------------------------------

//モンスターデータ
typedef struct{
	int no,lv,hp,mp,Enimg; //ナンバー、Lv,hp,mp,力、魔法力、画像
}enst_t;

extern enst_t enst[100];

extern int En00,En01,En02;


このEn00,En01,En02っていうのが画像ハンドルです。


グローバル変数はこちらにまとめました。

コード:

// -----------------------------------------------
//       Groval.h
//------------------------------------------------
//モンスターデータ
typedef struct{
	int no,lv,hp,mp,pow,mpow,Enimg; //ナンバー、Lv,hp,mp,力、魔法力、、画像
}enst_t;

int En00,En01,En02;


そしてモンスターの構造体のステータスはまとめてStatus.hに入れました。

コード:

// -----------------------------------------------
//       Status.h
//------------------------------------------------
enst_t enst[100]={
	{   0,   1,     80,    10,    15,    10,  En00 , "きのこ" , 5},
	{   1,   1,     90,    20,    12,    10,  En01 , "きのこ2" , 5},
	{   2,   1,     85,    20,    10,    10,  En02 , "栗" ,6},
};	//ナンバー、Lv,    hp,    mp,    力、魔法力、画像
En00~02にロードするのは、Load.cppのLoad_Img関数に入れました。

コード:

// -----------------------------------------------
//       Load.cpp
//------------------------------------------------
void Load_Img(){
		En00 = LoadGraph("画像/sub/きのこ.png"); //きのこ
		En01 = LoadGraph("画像/sub/きのこ2.png");  //きのこ2
		En02 = LoadGraph("画像/sub/栗.png");  //栗
}

main.cppの最初の方にLoad_Img関数を記述し、ロードしています。

そして、戦闘モジュールのbattle.cppにてモンスターのデータをこうしてよんでいます。↓

コード:

// -----------------------------------------------
//       Battle.cpp
//------------------------------------------------
void Battle_Graph(){

	DrawRotaGraph( 320, 240 , 2.0, 0, BF00, TRUE);
	DrawRotaGraph( BFPx, BFPy, 2.0 ,0, char00[4] , TRUE);

	DrawRotaGraph( BFE1x, BFE1y, 1.0 ,0, enst[E_t].Enimg , TRUE);//ランダム出現
	DrawFormatString(BFE1x-50,BFE1y+50,Cr,"HP : %d",enst[E_t].hp);
	DrawGraph(0,0,enst[3].Enimg,TRUE);
		if( NoE >0 ){
				DrawRotaGraph( BFE2x, BFE2y, 1.0 ,0, enst[E_t2].Enimg , TRUE);//ランダム2出現
				DrawFormatString(BFE2x-50,BFE2y+50,Cr,"HP : %d",enst[E_t2].hp);
					}
}

BFPとかBFEとかは定数宣言してて、簡単に言えば戦闘画面におけるプレイヤーと敵の座標を決めてるだけです。E_tっていうのは出現モンスターの番号を決める変数で、GetRandで取得するようにしてます。
ここで、このBattle.cppの9,10行目の
DrawRotaGraph( BFE1x, BFE1y, 1.0 ,0, enst[E_t].Enimg , TRUE);//ランダム出現
DrawFormatString(BFE1x-50,BFE1y+50,Cr,"HP : %d",enst[E_t].hp);
の、上(画像表示)の方だけ何もしてくれず、画像が呼べません。
コンパイルエラーもしないのでちんぷんかんぷんです。
下のほうはしっかり構造体からモンスターのHPを持ってきています。
何が原因か分かりません。どうしたら画像が表示されるようになりますか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: 構造体の画像が表示されない

#2

投稿記事 by beatle » 14年前

Extern.hとGlobal.hでenst_tの内容が異なるのが理解不能なのですが.

きずなん

Re: 構造体の画像が表示されない

#3

投稿記事 by きずなん » 14年前

すいません。単なるうち間違えです。
Extern.hの方にpow,mpowが抜けてました。
正しくはこうなります。

コード:

// -----------------------------------------------
//       Extern.h
//------------------------------------------------
 
//モンスターデータ
typedef struct{
    int no,lv,hp,mp,pow,mpow,Enimg; //ナンバー、Lv,hp,mp,力、魔法力、画像
}enst_t;
 
extern enst_t enst[100];
 
extern int En00,En01,En02;

きずなん

Re: 構造体の画像が表示されない

#4

投稿記事 by きずなん » 14年前

もひとつ間違えてました。
また「理解不能」って言われそうなんで修正しときます。

コード:

// -----------------------------------------------
//       Status.h
//------------------------------------------------
enst_t enst[100]={
    {   0,   1,     80,    10,    15,    10,  En00},
    {   1,   1,     90,    20,    12,    10,  En01},
    {   2,   1,     85,    20,    10,    10,  En02 }
};  //ナンバー、Lv,    hp,    mp,    力、魔法力、画像
説明用に省こうとして色々写し間違えました。ごめんなさい。

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

Re: 構造体の画像が表示されない

#5

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

モジュール設計理論から言えば、モンスターはモンスターの情報を同じヘッダやソースファイルに集めるべきです。
Extern.hやGroval.hと言った設計は分かりやすそうに見えますが後々ごちゃごちゃしてきて分かりづらくなっていきます。
それに、すでにenst_t;を同じ名前で定義が違う上に同じ定義を2箇所でするというミスをしています。こういうミスもちゃんと意味づけして集めれば避けることができます。

プログラム構造は、こちらを参考に。
龍神録などの設計はDixq(管理人)さんも良くない設計だとおっしゃっていますので真似しすぎないことおすすめします。
「新・C言語 ~ゲームプログラミングの館~ [DXライブラリ]」
http://dixq.net/g/
d.1 メイン関数の作り方
d.2 複数のファイルにわけてコンパイルする
d.3 ゲームの設計と分割コンパイル(1)
d.4 ゲームの設計と分割コンパイル(2)
d.5 ゲームの設計と分割コンパイル(3)


それとヘッダなどにあるグローバルな変数の実体が作られるのはプログラムが起動した瞬間です。
なので、En00,En01,En02は起動直後の値が入れられていますのでLoad_Img()の値は反映されません。これが今回の原因だと思います。
これは変数の寿命やスコープを勉強しましょう。

「C言語入門前編 - 1章 Cとは 7項.データの記憶クラス -」
http://homepage2.nifty.com/assua/aosite ... o/cb7.html
register (レジスタ)は気にしなくて良いです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 構造体の画像が表示されない

#6

投稿記事 by きずなん » 14年前

うーん・・・難しいです。

>すでにenst_t;を同じ名前で定義が違う上に同じ定義を2箇所でするというミスを
自分で考えても分からなかったのでもうちょっと詳しく説明していただけますか?
あと、extern は、「 元から定義してある変数をどこからも参照できるようにしますよ」って
意味にとらえてるんですがextern int ~~ としたら、これは再定義したことになってるんでしょうか?

>ヘッダなどにあるグローバルな変数の実体が作られるのはプログラムが起動した瞬間
とは、ビルドが終わった直後のことですか?グローバル変数の定義がしてあるヘッダをインクルードした瞬間でしょうか?
この場合、どこでEn00,En01,En02のロードをすれば放り込むことができるのでしょうか。
(後でモンスターだけのモジュールに作り直すのですが、参考までに教えてほしいです。)

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

Re: 構造体の画像が表示されない

#7

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

きずなん さんが書きました:うーん・・・難しいです。
>すでにenst_t;を同じ名前で定義が違う上に同じ定義を2箇所でするというミスを
自分で考えても分からなかったのでもうちょっと詳しく説明していただけますか?
あと、extern は、「 元から定義してある変数をどこからも参照できるようにしますよ」って
意味にとらえてるんですがextern int ~~ としたら、これは再定義したことになってるんでしょうか?
typedef struct{ ・・・ }enst_t;
が2ヶ所にある事自体がヘッダ構成が間違っている証拠です。
enst_tは1つの定義は1つで良いのです。

extern enst_t enst[100];もどれか1つのヘッダだけに書いて下さい。

コード:

// -----------------------------------------------
//       Status.h
//------------------------------------------------
enst_t enst[100]={
    {   0,   1,     80,    10,    15,    10,  En00 , "きのこ" , 5},
    {   1,   1,     90,    20,    12,    10,  En01 , "きのこ2" , 5},
    {   2,   1,     85,    20,    10,    10,  En02 , "栗" ,6},
};  //ナンバー、Lv,    hp,    mp,    力、魔法力、画像
これは、どこかのcppに有るべきです。
きずなん さんが書きました: >ヘッダなどにあるグローバルな変数の実体が作られるのはプログラムが起動した瞬間
とは、ビルドが終わった直後のことですか?グローバル変数の定義がしてあるヘッダをインクルードした瞬間でしょうか?
この場合、どこでEn00,En01,En02のロードをすれば放り込むことができるのでしょうか。
(後でモンスターだけのモジュールに作り直すのですが、参考までに教えてほしいです。)
exeがメモリにローディングされた直後です。
この配列の定義方法だとEn0xの値を正しくセットする方法はありません。
En00,En01,En02を配列にして、enst[]には配列番号を持つ方法にしてはどうでしょうか?
EnimgではなくEnimg_noってことですね。
En_img[ enst.Enimg_no ]
でイメージにアクセスする事になります。

なので上の配列も

コード:

// -----------------------------------------------
//       Status.h
//------------------------------------------------
enst_t enst[100]={
    {   0,   1,     80,    10,    15,    10,  0 , "きのこ" , 5},
    {   1,   1,     90,    20,    12,    10,  1 , "きのこ2" , 5},
    {   2,   1,     85,    20,    10,    10,  2 , "栗" ,6},
};  //ナンバー、Lv,    hp,    mp,    力、魔法力、画像
となるわけです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

きずなん

Re: 構造体の画像が表示されない

#8

投稿記事 by きずなん » 14年前

ほんと的確ですね。
画像セットも確かにそうするといけました。
softya屋さんのおっしゃるとおり、今のモジュールの組み方はマズそうなのでもう一度見直します。
ありがとうございました。

きずなん

Re: 構造体の画像が表示されない

#9

投稿記事 by きずなん » 14年前

すいません、解決でした。

閉鎖

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