画像の描画でエラーが出ます(ハンドル取得ができていない?)

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

画像の描画でエラーが出ます(ハンドル取得ができていない?)

#1

投稿記事 by » 18年前

 はじめまして。つい最近にこちらを参考にシューティングゲームを作り始めた者です。
 サンプルを魔改造しながらなんとか完成させようと奮闘しているのですが、ある処理をするとエラーが出てしまいます。

 その処理とは、敵撃破時に画像を表示するだけの単純なものなのですが、ビルドすると『player.obj : error LNK2001: 外部シンボル ""int img_enemy_death" (?img_enemy_death@@3HA)" は未解決です。』といったエラーが出てしまいます。
 サンプルの『ExternGV.h』と『GlobalVariable.h』で『img_enemy_death』というハンドルを取得し、『img_sound_load.cpp』で『img_enemy_death = LoadGraph("Sh/img/mons/enemy_death0.png")』として画像をロード、『player.cpp』にある『CollisionDetection()』関数内の当たり判定if内に『DrawGraph(0,0,img_enemy_death,FALSE)』で表示(描画位置は考慮していません)しているのですが……。

ソースはこんな感じです↓
if( (int)sqrt(x*x+y*y) < range+enemy.range){ //当たり判定内なら
DrawGraph(0,0,img_enemy_death,FALSE); //画面左上端に画像表示
enemy.flag=0; //表示フラグを戻す
PlayerShot[j].flag=0; //あたった弾を消す
if(CheckSoundMem(sound_enemy_death)==1) //消滅音がなっていなかったら
StopSoundMem(sound_enemy_death); //とめて
PlaySoundMem(sound_enemy_death,DX_PLAYTYPE_BACK); //消滅音をならす。
}

 色々試行錯誤してみたところ、どうやら『ExternGV.h』と『GlobalVariable.h』で取得しているはずの『int img_enemy_death』がちゃんと機能していないようなのです。まぁ当たり判定if内で直接画像を読み込み表示すれば解決したのですが、この先たくさんの画像を読み込んで表示することを思うと、サンプルにあるように読み込みを纏めておきたいんです。
 おそらく『ファイル場所を変えたら音楽が流れません』というトピックと同じ症状だと思うのですが、解決策がわからなかったので質問しました。
 ちなみに環境はXPでVC++Exp、SDKの読み込みはきちんとできているはずです。どなたか回答お願いできないでしょうか。
 よろしくおねがいします……。

管理人

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#2

投稿記事 by 管理人 » 18年前

ExternGV.hに
extern int img_enemy_death;

は書いているが、

GlobalVariable.hには
int img_enemy_death;

が書かれていない・・。などという場合このようなエラーが出ると思います。

ちゃんとGlobalVariable.hに宣言し、ExternGV.hにextern文が書かれていますか?
スペルミスなどありませんか?

#defineと#ifdefを使う事でこの2つのファイルが一つのファイルにまとめられますので、余力があればそちらにもトライしてみてください。

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#3

投稿記事 by » 18年前

 質問のお答え、ありがとうございました!
 しかし、『ExternGV.h』には『extern int img_enemy_death;』、『GlobalVariable.h』には『int img_enemy_death;』としっかり記述してあります。単純な文字に置き換えてもエラーが出るので、スペルミスやファイルの入れ忘れということもなさそうです。どうやら『img_sound_load.cpp』で『img_enemy_death = LoadGraph("Sh/img/mons/enemy_death0.png");』とした際にエラーが出てしまうようなのです。これがロードの失敗なのか、ハンドルが取得できていないからなのかは、わかりませんが……。
 過去ログを漁ってみたものの、同じ症状の方が幾人かいたのですが、解決策は見つからず。
 うーん、どうしたらいいのでしょう。

管理人

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#4

投稿記事 by 管理人 » 18年前

ファイルの場所が違う(ロード失敗・ハンドル取得出来ない)場合はコンパイルエラーにはなりません。
返り値に-1が来るだけなので、表示する際-1のハンドルを表示する事になり、表示されないだけです。

プロジェクトをまるごとzipにしてメール添付かアップローダに上げるかして見せていただけませんか?

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#5

投稿記事 by » 18年前

 『http://tool-ya.ddo.jp/webfs/~enigma』の『test.zip』で、パスは『test』です。
 デジタルゲームパッドでの入力を付け足したぐらいで、基本的にサンプルプログラムからいじってません。今回の処理のために追加した部分には、注釈を書いています。すいません、お手数かけますがよろしくおねがいします!

管理人

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#6

投稿記事 by 管理人 » 18年前

修正したプログラムをこちらに上げておきます。

http://dixq.net/zip/peach.zip

実はこの宣言の方法は実に非効率なんです。
ただこのサイトはわかりやすいをモットーに書いていこうと思ったので
なるべく入門の段階ではみたことの無いような構文は使わないように
書いていきました。
しかしそれがアダになったようで、無駄な文章をダラダラ書かないといけなくなってしまいました。

#ifdefの使い方ご存知でしょうか。



/*  main.cpp  */

#define _GLOBAL_INSTANCE_

#include "GV.h"

-------------------------------------------

/*  play.cpp  */

#include "GV.h"

--------------------------------------------

今上記のような2つのファイルがあるとします。
この2つのファイルはGV.hをインクルードするので、どちらもGV.hを通ります。
GV.hにイカのように書いた時には以下の様な条件分岐をします。


/*  GV.h  */

#ifdef _GLOBAL_INSTANCE_
//main.cppから呼ばれたときはココを通る
int count = 0;

#else
//play.cppから呼ばれたときはココを通る
extern int count;

#endif

---------------------------------------------

main.cppではGV.hをインクルードする前に_GLOBAL_INSTANCE_が定義されています。
よってGV.hをインクルードしたmain.cppから呼ばれたときはint count=0;を通ります。
定義しなかった、それ以外から呼ばれたときは#elseの部分を通ります。

このように書く事で、1つのファイルに纏める事が出来ます。
構造体の型や諸々の定義は全てのファイルでインクルードしないといけないことから、
GV.hの条件分岐しない最初の部分でインクルードすればいいでしょう。
これが最適な方法かどうかわかりませんが、私なりのやり方をご紹介しました。

詳しい中身はお渡ししたzipファイルをみてください。

ソースファイル中身は変更していません。
2つのhファイルだけ変更しています。
 

Justy

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#7

投稿記事 by Justy » 18年前

> これが最適な方法かどうかわかりませんが
 余談ですが、多数のグローバル変数を扱う場合、最適な方法の1つはこれです。

Cプログラミング診断室/管理は複雑に/ほとんど同じ
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.5.4.html

 こちらのように GLOBALマクロを使って、定義と宣言を1箇所に纏めてしまえば、
グローバル変数の追加・修正・削除が入ったときのミスが減ります。


 あと、_GLOBAL_INSTANCE_の名前は処理系が予約(_で始まって次が大文字)しているので、
避けた方がいいかと。

管理人

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#8

投稿記事 by 管理人 » 18年前

なるほど~、便利ですね。
今後重宝させていただきます。逆に勉強になりましたm(_ _)m
名前は変えたほうがいいですね。
いつもありがとうございます。

Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)

#9

投稿記事 by » 18年前

 回答ありがとうございました! 修正ファイル、DLしました。しっかり動きました。

 #ifdefですか……GlobalVariable.hで定義していたものをifdefで最初に定義し、ExternGV.hで定義していたものをelseで定義、と。一つに纏まったことでエラーが出なくなったのですか。うーむ、なかなか繊細ですね(笑
 Justyさんもありがとうございました! こういうやりかたもあるのですね。そちらのサイト様も参考にしながら、続きを作っていきたいと思います。

 思ったより大事だったので少し驚いてますが、ともかく。お二方、ありがとうございました!

閉鎖

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