はじめまして。つい最近にこちらを参考にシューティングゲームを作り始めた者です。
サンプルを魔改造しながらなんとか完成させようと奮闘しているのですが、ある処理をするとエラーが出てしまいます。
その処理とは、敵撃破時に画像を表示するだけの単純なものなのですが、ビルドすると『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:画像の描画でエラーが出ます(ハンドル取得ができていない?)
ExternGV.hに
extern int img_enemy_death;
は書いているが、
GlobalVariable.hには
int img_enemy_death;
が書かれていない・・。などという場合このようなエラーが出ると思います。
ちゃんとGlobalVariable.hに宣言し、ExternGV.hにextern文が書かれていますか?
スペルミスなどありませんか?
#defineと#ifdefを使う事でこの2つのファイルが一つのファイルにまとめられますので、余力があればそちらにもトライしてみてください。
extern int img_enemy_death;
は書いているが、
GlobalVariable.hには
int img_enemy_death;
が書かれていない・・。などという場合このようなエラーが出ると思います。
ちゃんとGlobalVariable.hに宣言し、ExternGV.hにextern文が書かれていますか?
スペルミスなどありませんか?
#defineと#ifdefを使う事でこの2つのファイルが一つのファイルにまとめられますので、余力があればそちらにもトライしてみてください。
Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)
質問のお答え、ありがとうございました!
しかし、『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");』とした際にエラーが出てしまうようなのです。これがロードの失敗なのか、ハンドルが取得できていないからなのかは、わかりませんが……。
過去ログを漁ってみたものの、同じ症状の方が幾人かいたのですが、解決策は見つからず。
うーん、どうしたらいいのでしょう。
しかし、『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:画像の描画でエラーが出ます(ハンドル取得ができていない?)
ファイルの場所が違う(ロード失敗・ハンドル取得出来ない)場合はコンパイルエラーにはなりません。
返り値に-1が来るだけなので、表示する際-1のハンドルを表示する事になり、表示されないだけです。
プロジェクトをまるごとzipにしてメール添付かアップローダに上げるかして見せていただけませんか?
返り値に-1が来るだけなので、表示する際-1のハンドルを表示する事になり、表示されないだけです。
プロジェクトをまるごとzipにしてメール添付かアップローダに上げるかして見せていただけませんか?
Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)
『http://tool-ya.ddo.jp/webfs/~enigma』の『test.zip』で、パスは『test』です。
デジタルゲームパッドでの入力を付け足したぐらいで、基本的にサンプルプログラムからいじってません。今回の処理のために追加した部分には、注釈を書いています。すいません、お手数かけますがよろしくおねがいします!
デジタルゲームパッドでの入力を付け足したぐらいで、基本的にサンプルプログラムからいじってません。今回の処理のために追加した部分には、注釈を書いています。すいません、お手数かけますがよろしくおねがいします!
Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)
修正したプログラムをこちらに上げておきます。 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ファイルだけ変更しています。
Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)
> これが最適な方法かどうかわかりませんが
余談ですが、多数のグローバル変数を扱う場合、最適な方法の1つはこれです。
Cプログラミング診断室/管理は複雑に/ほとんど同じ
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.5.4.html
こちらのように GLOBALマクロを使って、定義と宣言を1箇所に纏めてしまえば、
グローバル変数の追加・修正・削除が入ったときのミスが減ります。
あと、_GLOBAL_INSTANCE_の名前は処理系が予約(_で始まって次が大文字)しているので、
避けた方がいいかと。
余談ですが、多数のグローバル変数を扱う場合、最適な方法の1つはこれです。
Cプログラミング診断室/管理は複雑に/ほとんど同じ
http://www.pro.or.jp/~fuji/mybooks/cdiag/cdiag.5.4.html
こちらのように GLOBALマクロを使って、定義と宣言を1箇所に纏めてしまえば、
グローバル変数の追加・修正・削除が入ったときのミスが減ります。
あと、_GLOBAL_INSTANCE_の名前は処理系が予約(_で始まって次が大文字)しているので、
避けた方がいいかと。
Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)
なるほど~、便利ですね。
今後重宝させていただきます。逆に勉強になりましたm(_ _)m
名前は変えたほうがいいですね。
いつもありがとうございます。
今後重宝させていただきます。逆に勉強になりましたm(_ _)m
名前は変えたほうがいいですね。
いつもありがとうございます。
Re:画像の描画でエラーが出ます(ハンドル取得ができていない?)
回答ありがとうございました! 修正ファイル、DLしました。しっかり動きました。
#ifdefですか……GlobalVariable.hで定義していたものをifdefで最初に定義し、ExternGV.hで定義していたものをelseで定義、と。一つに纏まったことでエラーが出なくなったのですか。うーむ、なかなか繊細ですね(笑
Justyさんもありがとうございました! こういうやりかたもあるのですね。そちらのサイト様も参考にしながら、続きを作っていきたいと思います。
思ったより大事だったので少し驚いてますが、ともかく。お二方、ありがとうございました!
#ifdefですか……GlobalVariable.hで定義していたものをifdefで最初に定義し、ExternGV.hで定義していたものをelseで定義、と。一つに纏まったことでエラーが出なくなったのですか。うーむ、なかなか繊細ですね(笑
Justyさんもありがとうございました! こういうやりかたもあるのですね。そちらのサイト様も参考にしながら、続きを作っていきたいと思います。
思ったより大事だったので少し驚いてますが、ともかく。お二方、ありがとうございました!