ホームへ戻る

 d.2章 複数のファイルに分けてコンパイルする

 今はまだサンプルの段階なので、1つのファイルで良いですが、ゲームが大規模になると、1つのファイルで作るわけにはいきません。
1つのファイルに全ての機能が含まれていると、どこになんの機能があるのかさっぱり分からなくなってしまいます。
そこで、ソースコードをなんらかの単位でファイルごとに分割したいと思います(あえて機能単位で分割しない理由は後述)

 詳しい事は次の章で話しますのでまずは一度ファイル分割を行ってみましょう。
まず、ファイルを分けると、グローバル変数であってもファイル間で変数の参照は出来ません。関数の呼び出しも出来ません。
出来るようにするには、「
この変数や関数どこかで定義してあるからね」という一文を書く必要があります。

今回は変数の参照の仕方は置いておき、関数の参照の仕方を説明します。
まず、試しにSTGのモジュールの一つである「プレイヤー」という単位で一つファイルを作ってみましょう。

ファイルの追加の仕方は、ソリューションエクスプローラー上の「ソースファイル」フィルタ上で右クリックし

「追加」 > 「新しい項目」



出てきた「新しい項目の追加」ウィンドウで「C++ファイル (.cpp)」を選択し、「ファイル名」に「Player」と入力し、「追加」を押します。



下の画像のように、ソリューションエクスプローラーに「Player.cpp」が追加されました。

編集したいファイル名をダブルクリックすることで編集出来るようになります。



今回、「Player.h」というファイルも必要なので、先ほどと同様に「追加」 > 「新しい項目」から
「新しい項目の追加」ウィンドウを出し、今度は「
ヘッダー ファイル (.h)」を選択し、「ファイル名」に「Player」と入力し、「追加」して、Player.hも追加して下さい。

では、「Player.cpp」ファイルに以下のように入力して下さい。


/* Player.cpp */


#include "DxLib.h"

void Player_test(){
        DrawFormatString( 0, 0, GetColor(255,255,255), "分割出来ています" );
} 

 「分割出来ています」と表示するだけの関数です。
このファイルにはこれを実行する Player_test関数 だけしかありません。

 そして、これから行うのがファイル分割で必要な重要な作業です。
ファイルは「.cpp」と「.h」(ヘッダファイル)を対で作ります(ファイル名を同じにするのが一般的です)
.cppファイルに実際の処理(関数の実体)を書き、ヘッダファイルにはその関数の
プロトタイプ宣言を書きます。
プロトタイプ宣言とは「こういう関数がありますのでよろしく」とコンパイラに伝える為のものです。

 Player_test関数のプロトタイプ宣言をヘッダファイルに書いてみます。


/* Player.h */


void Player_test();

このたった一行です。
これをどう利用するのかと言うと・・・。
main.cppを見てみましょう。


/* main.cpp */


#include "DxLib.h"
#include "Player.h"

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
        ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen( DX_SCREEN_BACK );
        while( ScreenFlip()==0 && ProcessMessage()==0 && ClearDrawScreen()==0 ){
                Player_test();
        }
        DxLib_End();
        return 0;
} 

書き出し部を見て下さい。

#include "Player.h"

と書いてありますね。
今まで #include は特に意識することなく書いていたかもしれませんが、これは、ファイルの内容を置換していると理解しておくとよいでしょう。
つまり、
#include "Player.h"
とかけば、Player.h に書いた内容をそこに書いたのと同じことになります。すなわち

  #include "DxLib.h"
  void Player_test();

  int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
  ...

こんな感じに書いたのと同じことです。
main.cppで「Player_testって関数がどこかで宣言してあるからね」という印を明記したことで、main.cppから
Player_test関数 が呼べるようになりました。

よって、whileループ内で、この関数を呼びだすことが出来たのです。

実行結果



このようにして、他のファイルで定義した関数を呼べるようになりました。

次の章で、この仕組みをゲームに取り入れてみましょう。

本章のプロジェクトファイルはこちらです。必要があればDLして下さい。

→分からないことがあれば掲示板で質問して下さい


- Remical Soft -