第4章 モジュール分割

4-5 共通ヘッダ・ファイルの作成

ここまでで、プロジェクト全体としては長いプログラムになったが、機能別にソースを分割したため、1つ1つのソース・ファイルは分かりやすくなった。

しかしこの状態では、それぞれのcppファイルに同じ内容のマクロ定義を持たなければならなかったり、ソースが増えた場合に他のソースのインクルードをすべて追加しなければならないなど、まだまだ効率が悪い。
そこで、各ソース・ファイルで共通に宣言するインクルードやマクロをひとまとめにしたヘッダ・ファイルを作成し、各ソースファイルから共通に使うよう修正する。

(a) 共通部分の取り出し

まず、分割したソース・ファイル内で、共通で宣言しているものは何かを考えると、次のようになる。

  1. windows.h、ddraw.hなどのインクルード文(#include 〜)
  2. 状態の数字を表すマクロ文(#define 〜)
  3. 外部変数(extern 〜)

これらを宣言するヘッダ・ファイルを作成し、各ソース・ファイルからインクルードすることにより、修正による無駄を省く。

(b) 共通ヘッダ・ファイル「common.h」の作成

各ソース・ファイルから共通にインクルードするヘッダ・ファイル「common.h」を作成する。

  1. プロジェクトにヘッダ・ファイル「common.h」を新規作成する。
  2. 各ソースから共通部分を抜き出し、common.hに貼り付ける。
    //=============================================================================
    // プロジェクト内で共通に読み込まれるヘッダ・ファイル
    //=============================================================================
    
    //-----------------------------------------------------------------------------
    // インクルード・ファイル
    //-----------------------------------------------------------------------------
    #include <windows.h>
    #include <windowsx.h>
    #include <stdio.h>
    #include <ddraw.h>
    #include "myDraw.h"
    #include "Start.h"
    #include "Game.h"
    
    //-----------------------------------------------------------------------------
    // マクロ定義
    //-----------------------------------------------------------------------------
    #define START_INIT     0
    #define START_FRAME    1
    #define GAME_INIT      10
    #define GAME_FRAME     11
    
    //-----------------------------------------------------------------------------
    // 外部変数(本体は別ソース)
    //-----------------------------------------------------------------------------
    /* DirectDrawオブジェクト関係 */
    extern LPDIRECTDRAW7 g_pDD;                 // DirectDraw オブジェクト
    extern LPDIRECTDRAWSURFACE7 g_pDDSPrimary;  // プライマリサーフェイス
    extern LPDIRECTDRAWSURFACE7 g_pDDSBack;     // バックバッファ 
    extern LPDIRECTDRAWSURFACE7 g_pDDSStart;    // スタート画像用サーフェイス
    extern LPDIRECTDRAWSURFACE7 g_pDDSGame;     // ゲーム画像用サーフェイス
    
    /* 共通 */
    extern BYTE g_FrameNo;      // フレーム選択用
    extern BYTE KeyTbl[256];    // キー情報
    extern RECT ScreenRect;     // ウィンドウの矩形
  3. 作成した共通ヘッダ・ファイルを各ソースからインクルードする(例、WinMain.cpp)
    ※外部変数の本体(この場合g_FrameNo、KeyTbl[256]、ScreenRect)以外にcommon.hに宣言したものがソース内にあってはならない。
    //=============================================================================
    //      2Dゲーム基本プログラム2(基本プログラムからの分割)
    //=============================================================================
    #include "common.h"
    
    //-----------------------------------------------------------------------------
    // プロトタイプ宣言
    //-----------------------------------------------------------------------------
    static LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
    static HWND InitApp(HINSTANCE, int);
    static void UpdateFrame(HWND);
    
    //-----------------------------------------------------------------------------
    // 外部変数(本体)
    //-----------------------------------------------------------------------------
    /* 共通 */
    BYTE g_FrameNo = START_INIT;        // フレーム選択用
    BYTE KeyTbl[256];                   // キー情報
    RECT ScreenRect = {0, 0, 640, 480}; // ウィンドウの矩形
    
    //-----------------------------------------------------------------------------
    // グローバル変数
    //-----------------------------------------------------------------------------
    /* ウィンドウ関係 */
    static char szWinName[] = "Skeleton";                   // ウィンドウクラス名
    static char szTitle[] = "2Dゲーム基本プログラム2";   // ウィンドウタイトル名
    
    //=============================================================================
    //      ウィンドウメイン関数(WinMain)
    //=============================================================================
    int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
    {
        ・
        ・
        ・

myDraw.cppは、common.hの他にddutil.hもインクルードしなければならないことに注意!!

#include "common.h"
#include "ddutil.h"

確認!!

ここまでやったらリビルドを行い、プログラムが正常に動くかどうか確かめよう。


[ TOP ]