• 締切済み

ゲームプログラミングについて

ファイル分割について。(長文失礼) scene.hファイル #include "Dxlib.h" #define EXTERN #else #define EXTERN extern #endif extern void Opening(); extern void Menu(); extern void Danjon(); extern void attack(); extern void Ending(); EXTERN int apple;// 画像を入れる変数 EXTERN int TITLE_CG; EXTERN char KeyBuf[256];// キーが押されてる状態を入れる文字配列 EXTERN int Key[256]; // キーが押されているフレーム数を格納する EXTERN int x=320, y=240; EXTERN int function_status=0,White; scene.cppファイル #include "scene.h" void Opening(){ } void Menu(){ DrawString(100,140,"メニュー画面 (xをプッシュ)",White); if(KeyBuf[KEY_INPUT_X]==1) function_status=2; } void Danjon(){ DrawString(100,180,"ダンジョン画面 (cをプッシュ)",White); if(KeyBuf[KEY_INPUT_C]==1) function_status=3; } void attack(){ DrawString(100,220,"戦闘画面 (vをプッシュ)",White); if(KeyBuf[KEY_INPUT_V]==1) function_status=4; } void Ending(){ DrawString(100,260,"エンディング画面 (bをプッシュ)",White); if(KeyBuf[KEY_INPUT_B]==1) function_status=5; } main.cppファイル #define _SCENE_H_ #include "scene.h" 以下(長くなるので)一部抜粋の形をとりました void gpCalc() {     if( Key[ KEY_INPUT_RIGHT ] >= 1 ){ x += 5 ;     }     if( Key[ KEY_INPUT_DOWN ] >= 1 ){ y += 5;     }     if( Key[ KEY_INPUT_LEFT ] >= 1 ){ x -= 5;     }     if( Key[ KEY_INPUT_UP ] >= 1 ){ y -= 5;     } } switch(function_status) { case 0: Opening();    DrawRotaGraph( x, y, 1.0, 0.0, TITLE_CG, TRUE );    break;    case 1:    Menu();    DrawRotaGraph( x, y, 1.0, 0.0, apple, TRUE );    break;    case 2:    Danjon();    break;    case 3:    attack();    break;    case 4:    Ending();    break;    default: return 0;    break; } int x,y,function_statusが何かこの文章ではわかりにくいとは思いますが、なにとぞご勘弁を。 これでF5を押すと、int x,y,function_statusの三つが既にmain.objで定義されているといわれ、エラーが出てしまいます。(念のため、一つのファイルにまとめたものは実行確認済みです) ヘッダーファイルの書き方に問題があるのでしょうか?それとも、mainで余計なことをしてしまっているのでしょうか。 どなたか教えていただけないでしょうか。 もし必要であればmainのソースもすべて開示したいと思っています。 (おそらく書ききれると思います)

みんなの回答

  • Wr5
  • ベストアンサー率53% (2173/4061)
回答No.2

>これでF5を押すと、int x,y,function_statusの三つが既にmain.objで定義されているといわれ、エラーが出てしまいます。(念のため、一つのファイルにまとめたものは実行確認済みです) >ヘッダーファイルの書き方に問題があるのでしょうか?それとも、mainで余計なことをしてしまっているのでしょうか。 初期値を設定しているために、各ファイルに実体が作られた…のではないですかね? 私ならヘッダにはexternで宣言だけ、ソースファイルの一つで定義を行いますね。 # 初期値はmain()内などで代入するようにします。

_Purple_
質問者

お礼

回答ありがとうございます。 無事解決いたしました。ご指摘の通り、宣言と初期化を同時にしていたのが原因でした。 これで作業が進められるようになります。ありがとうございました。

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

scene.hファイルの #include "Dxlib.h" と #define EXTERN との間に #ifdef _SCENE_H_ が抜けています。 ……が、以下の理由から_SCENE_H_という識別子名は変えたほうがいいと思います。 (1)_で始まりその次が大文字の識別子名は処理系の実装用に予約されていること(参考URL) (2)ファイル名と同じに読める識別子はインクルードガードによく使われていること

参考URL:
http://www.wdic.org/w/TECH/%E4%BA%88%E7%B4%84%E6%B8%88%E3%81%BF%E8%AD%98%E5%88%A5%E5%AD%90
_Purple_
質問者

お礼

別の方の回答で解決いたしましたので。あなたをベストアンサーとすることは致しかねますが、回答をくださったことに関しては、大変感謝しております。 ありがとうございました。

_Purple_
質問者

補足

すみません、#ifdef _SCENE_H_はプログラムのほうには記入済みでした。 コピペし損ねた・・・。他の理由は考えられませんか? 識別子記名に関してはご指摘ありがとうございます。以後気を付けます。