6. 先ほどのプログラムを分割してみる。
今回は、また戻って、いつものDXライブラリのプロジェクトです。
まず、
#include "○○.h"
とかくと、○○.hの内容を、プログラムの最初に書いたのと同じ意味になります。つまり
test.h
という名前のファイルに
int a=0;
とだけ書いて、保存します。すると
#include<stdio.h>
#include "test.h"
void main(){
printf("%d",a);
}
と書いて実行すると
実行結果
0
となります。つまり、ヘッダファイルをインクルードすると、それを上に書いたことになるんです。
これを利用して、グローバル変数の宣言はをヘッダファイルにまとめましょう。
グローバル変数という意味のGlobalVariable.hというファイルを作り、
先ほど作ったグローバル変数↓
int counter=0,color_white;
char Key[256];
int img_background[2];
int img_player[4];
typedef struct{
double x,y;
int status,counter; int shot [11][15];
} BODY_player_t;
BODY_player_t Player;
これを書いて保存しましょう。(実際にはまだしなくていいです。ここは解説ですから)
実行プロジェクト、今作っているプロジェクトと同じ階層に保存してください。
ですから、今度は最初に
#include "GlobalVariable.h"
と、書けば、いいわけですね。
ここでなぜ
#include <GlobalVariable.h>と、かかずにダブルコーテーションで囲んだかですが、stdio.hというファイルは、
今作っているプロジェクトのある階層にあるわけではありませんよね。
しかしGlobalVariable.hは、現在のフォルダにあります。つまり””で囲んだファイルは現在のフォルダにあるという
事を示しています。ですから、自作したファイルはダブルコーテーションで囲む必要があります。
今度は、メインで宣言したグローバル変数を違うファイルから参照できるようにextern宣言した記述をまとめた
ヘッダファイルを作ります。
extern宣言は、任意の場所で行ったほうがいいのですが、今回はプログラムの複雑化を防ぐためと、めんどくさくないようということを
かねて、全部まとめてextern宣言します。
extern宣言をしたヘッダファイルを全てのファイルから参照すれば、全てのグローバル変数がどこでも参照できるようになります。
では具体的に。
extern宣言をまとめたヘッダファイル名(なんでもいいんですが)はExternGV.hという名前にします。
この名前のファイルに
extern int counter,color_white;
extern char Key[256];
extern int img_background[2];
extern int img_player[4];
typedef struct{
double x,y;
int status,counter; int shot [11][15];
} BODY_player_t;
extern BODY_player_t Player;
これらのextern宣言を保存します。(実際にはまだしなくていいです。ここは解説ですので)
typedef structというのは型であり、単なる「入れ物のかたどり」であって、変数でも関数でもないので、
externする必要はありません。しかし一番下のextern宣言で、型を使うのでここで
型の形を示すために、書いておく必要があります。
では、実際に4節で紹介した変数、関数達、を各ファイルへ分割していきましょう。
main関数はそのまま、main.cppに残しておきます。
次に追加するファイルを作っていきます。
現在プロジェクトのソースファイルにはmain.cppだけあるはずですね。VC++を例に説明していきます。
ファイルを作るときは、ソリューションエクスプローラーで、「ソースファイル」右クリックし、
「追加」→「新しい項目の追加」で
img_sound_load.cpp と書いて保存してください。場所は通常変えなくていいです。
ファイル名はこれから任意のものへ変えながら保存していってくださいね。
先ほど作った画像や、音楽をロードするimg_sound_load()関数は、
今作ったimg_sound_load.cppというファイルに保存します。
以下のプログラムをコピーしてください。
/* img_sound_load.cpp */
#include "DxLib.h" #include "ExternGV.h" void img_sound_load(){ img_background[0] = LoadGraph("Sh/img/back/background0.png"); img_background[1] = LoadGraph("Sh/img/back/background1.png"); LoadDivGraph( "Sh/img/char/player.png" , 4 , 4 , 1 , 32 , 48 , img_player ) ; }
これで1つのファイルの作業は終わりです。
それでは、上記同様に、作業をすすめていきましょう。
先ほど作った初期化や、フォントカラーを作成したinitialization()関数とSetColor()関数は、
initial.cppというファイルを作って現在のプロジェクトファイルのあるフォルダに保存しましょう。
そこに以下のプログラムをコピーしてください。
どうようにソースファイル→「追加」からファイルを追加してください。
/* initial.cpp */
#include "DxLib.h" #include "ExternGV.h" void initialization(){ Player.x=200.0; Player.y=400.0; Player.counter=0; Player.status=0; } void SetColor(){ color_white = GetColor(255,255,255); //白色ハンドルを取得 }
先ほど作った背景を描画するBackground関数は、
background.cppというファイルを作って現在のプロジェクトファイルがあるフォルダに保存しましょう。
/* background.cpp */
#include "DxLib.h" #include "ExternGV.h" void Background(){ DrawGraph(0,0,img_background[0],FALSE); } void Background2(){ DrawGraph(420,0,img_background[1],FALSE); }
先ほど作ったプレイヤーを描画するPlayerControl関数は、
player.cppというファイルを作って現在のプロジェクトファイルがあるフォルダに保存しましょう。
/* player.cpp */
#include "DxLib.h" #include "ExternGV.h" void PlayerControl(){ DrawGraph((int)Player.x,(int)Player.y,img_player[0],TRUE); }
先ほど作ったFPSを計算、描画するFpsTimeFanction()関数は、
fps.cppというファイルを作って現在のプロジェクトファイルがあるフォルダに保存しましょう。
/* fps.cpp */
#include "DxLib.h" #include "ExternGV.h" void FpsTimeFanction(){ static int FpsTime[2]={0,},FpsTime_i=0; static double Fps=0.0; if(FpsTime_i== 0) FpsTime[0]=GetNowCount(); //1周目の時間取得 if(FpsTime_i==49){ FpsTime[1]=GetNowCount(); //50周目の時間取得 Fps = 1000.0f / ((FpsTime[1] - FpsTime[0]) / 50.0f);//測定した値からfpsを計算 FpsTime_i=0; } else FpsTime_i++; //現在何周目かカウント if(Fps != 0) DrawFormatString(565,460,color_white,"FPS %.1f",Fps); //fpsを表示 return; }
最後に、main.cppは作らなくても既にありますよね。ここにはこのように書いてください。
注意! Borlandのコンパイラをお使いの方は次のextern文をWinMain関数の上に書いて下さい。
/* main.cpp */
#include "DxLib.h" #include "GlobalVariable.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){ extern void img_sound_load(); extern void initialization(); extern void SetColor(); extern void Background(); extern void PlayerControl(); extern void Background2(); extern void FpsTimeFanction(); int RefreshTime=0; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; SetDrawScreen( DX_SCREEN_BACK ) ; //裏画面を使用する。 img_sound_load(); initialization(); SetColor(); while(ProcessMessage() == 0 && GetHitKeyStateAll(Key) == 0){ RefreshTime = GetNowCount(); //今の時間を取得 ClearDrawScreen(); //裏画面のデータを全て削除 Background(); PlayerControl(); Background2(); FpsTimeFanction(); ScreenFlip() ; //裏画面データを表画面へ反映 counter++; if(Key[KEY_INPUT_ESCAPE]==1) break; //Escapeが押されたら終了 while(GetNowCount() - RefreshTime < 17);//1周の処理が17ミリ秒になるまで待つ } DxLib_End() ; return 0 ; }
長い作業お疲れ様でした。プログラムファイルは以上です。
上で説明しましたが、グローバル宣言をまとめたヘッダファイルと、
extern宣言をまとめたヘッダファイルも作っておきましょう。
今度はヘッダファイルなんで、拡張子を .h にしてください。
GlobalVariable.cppというファイルを作ってそこに上記のプログラムを保存してください。
別にどちらでもいいんですが、今回はわかりやすいように、ヘッダファイルとソースファイルをわけましょう。
今まではソリューションエクスプローラーの「Sorce Files」を右クリックして「追加」していましたが
一つ下にある「Dxlib」を右クリックして「追加」してください。
/* GlobalVariable.h */
// グローバル宣言 int counter=0; int color_white; char Key[256]; //画像ファイルハンドル int img_background[2]; int img_player[4]; //構造体 typedef struct{ double x,y; int status,counter; int shot [11][15]; } BODY_player_t; BODY_player_t Player;
こちらも同様に
/* ExternGV.h */
// extern 宣言 extern int counter; extern int color_white; extern char Key[256]; //画像ファイルハンドル extern int img_background[2]; extern int img_player[4]; //構造体 typedef struct{ double x,y; int status,counter; int shot [11][15]; } BODY_player_t; extern BODY_player_t Player;
これで、全てのファイル作成作業は終わりです。
うまく、ソリューションエクスプローラーに表示されていますか?
作成したファイルや、ヘッダファイルは5節で紹介したとおりの手順で、プロジェクトに追加できます。
ソリューションエクスプローラーの表記がこのようになっていれば、完成です。
この状態で、実行してみて以下の画面がでたら成功です。
実行画面
DXライブラリ著作権表示
DX Library Copyright (C) 2001-2006 Takumi
Yamada.