ソースコードは複数に分割し、分割コンパイルとなっております。
main.cpp, draw.cpp, Stage.cppの3つのファイルがあるとします。
main.cppにグローバル変数として、構造体の実体が以下のように定義されています。
// 構造体実体定義
PC Pc[PCNUM];
CAMERA Camera;
BULLET PcBullet[SHOTMAX];
MAP Map[MAPNUM];
GAME Game;
KEYCON KeyCon,PadCon;
SHADER Shader;
FONT Font;
DRAW Draw[DRAWMAX];
GRAPHHANDLE Handle;
TEAM Team[PCNUM];
NUM Num;
KILLLOG KillLog[KILLLOGMAX];
extern PC Pc[PCNUM];
extern CAMERA Camera;
extern GAME Game;
extern MAP Map[MAPNUM];
extern FONT Font;
extern GRAPHHANDLE Handle;
extern TEAM Team[PCNUM];
extern DRAW Draw[DRAWMAX];
extern KILLLOG KillLog[KILLLOGMAX];
extern NUM Num;
分割コンパイルは実は初めての試みで、これでとりあえず動いているのでなんとなくいいかなってずっと作業を進めていたのですが、
ぶっちゃけこれでは意味がないですよね?
(一応、draw.cppで使わないものはexternしていないので隠蔽にはなっているといえばなっていると思いますが…)
と気になってきました。
そこで、比較的規模の小さいStage.cppをextern 宣言しないように以下のように置き換えてみました。
#include "DxLib.h"
#include "Stage.h"
// ステージギミック
void StageGimmick(PC *Pc, GAME *Game){
OutArea(Pc,Game);
}
// 範囲外に出た時の処理
void OutArea(PC *Pc, GAME *Game){
for(int i=0;i<PCNUM;i++){
// 範囲外に出たらダメージ
if((Pc[i].Pos.x<-STAGESIZE/2||STAGESIZE/2<Pc[i].Pos.x||
Pc[i].Pos.y<-STAGESIZE/2||STAGESIZE/2<Pc[i].Pos.y||
Pc[i].Pos.z<-STAGESIZE/2||STAGESIZE/2<Pc[i].Pos.z)&&
!(Pc[i].State==PS_DEADLY||Pc[i].State==PS_DEAD)){
Pc[i].Life--;
Pc[i].Damage++;
Pc[i].Flag.LastDamageFrame=Game->Frame;
// HP0になったら死亡予約
if(Pc[i].Life<=0){
Pc[i].State=PS_DEADLY;
Pc[i].Flag.LastDeadlyFrame=Game->Frame;
Pc[i].Killed=-1;
Pc[i].Killedby=-1;
}
}
}
}
Stage.cppのように、構造体は全てのソースコードから見えるようにしないようにして、
その構造体が必要なら参照渡しする手法の方がいいのか。はたまた別の方法がいいのか。extern 宣言でオールOKなのか。
正直分かりません。
あと、構造体以外にもmain.cppでグローバル変数が定義してあるのですが、これも引数として渡してあげるべきですか?
分割コンパイル時のグローバル変数の使い方について教えてください。