第4章 モジュール分割

4-3 WinMain.cppからスタート処理を取り出す

同様に、スタート処理・ゲーム処理を取り出して別ソースで管理する。まずはスタート処理を別ソースに変換する。

(a) Start.cppの作成

  1. Start.cppを新規作成し、プロジェクトに追加する。
  2. WinMain.cppのインクルード文をコピーし、Start.cppに貼り付ける。
    //=============================================================================
    //	Start処理関係の自作関数群
    //=============================================================================
    #include <windows.h>
    #include <windowsx.h>
    #include <stdio.h>
    #include <ddraw.h>
    #include "myDraw.h"
  3. スタート処理ではフレームナンバーのセットを行うため、WinMain.cppのマクロ文をコピーする。
    //-----------------------------------------------------------------------------
    // マクロ定義
    //-----------------------------------------------------------------------------
    #define START_INIT     0
    #define START_FRAME    1
    #define GAME_INIT      10
    #define GAME_FRAME     11
  4. スタート処理で使用する関数(StartInit、StartFrame)のプロトタイプ宣言を行う。
    //-----------------------------------------------------------------------------
    // プロトタイプ宣言
    //-----------------------------------------------------------------------------
    void StartInit(HWND);
    void StartFrame(HWND);
  5. スタート処理では背景やゲームタイトルなどの描画を行うため、DirectDrawオブジェクト変数を外部変数として読み込む(本体はmyDraw.cpp内)。
    //-----------------------------------------------------------------------------
    // 外部変数(本体は別ソース)
    //-----------------------------------------------------------------------------
    /* DirectDrawオブジェクト関係 */
    extern LPDIRECTDRAW7 g_pDD;                 // DirectDraw オブジェクト
    extern LPDIRECTDRAWSURFACE7 g_pDDSPrimary;  // プライマリ・サーフェイス
    extern LPDIRECTDRAWSURFACE7 g_pDDSBack;     // バック・サーフェイス 
    extern LPDIRECTDRAWSURFACE7 g_pDDSStart;    // スタート画像用サーフェイス
    extern LPDIRECTDRAWSURFACE7 g_pDDSGame;     // ゲーム画像用サーフェイス
  6. 各場面共通で利用する変数を外部変数として読み込む(本体はWinMain.cpp内)
    /* 共通 */
    extern BYTE g_FrameNo;      // フレーム選択用
    extern BYTE KeyTbl[256];    // キー情報
    extern RECT ScreenRect;     // ウィンドウの矩形
  7. スタート処理でしか使わない変数をグローバル変数としてstatic付きで宣言する(WinMain.cpp内からは削除)。
    //-----------------------------------------------------------------------------
    // グローバル変数
    //-----------------------------------------------------------------------------
    /* スタート処理用 */
    static RECT TitleRect;      // タイトルの矩形
    static RECT StartRect;      // スタート画像の矩形

[完成後のStart.cpp]

//=============================================================================
//      Start処理関係の自作関数群
//=============================================================================
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <ddraw.h>
#include "myDraw.h"

//-----------------------------------------------------------------------------
// マクロ定義
//-----------------------------------------------------------------------------
#define START_INIT     0
#define START_FRAME    1
#define GAME_INIT      10
#define GAME_FRAME     11

//-----------------------------------------------------------------------------
// プロトタイプ宣言
//-----------------------------------------------------------------------------
void StartInit(HWND);
void StartFrame(HWND);

//-----------------------------------------------------------------------------
// 外部変数(本体は別ソース)
//-----------------------------------------------------------------------------
/* 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;     // ウィンドウの矩形

//-----------------------------------------------------------------------------
// グローバル変数
//-----------------------------------------------------------------------------
/* スタート処理用 */
static RECT TitleRect;      // タイトルの矩形
static RECT StartRect;      // スタート画像の矩形

//-----------------------------------------------------------------------------
// 関数名 : StartInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
void StartInit(HWND hWnd)
{
    ・
    ・
    ・

}

//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: 画面更新処理
//-----------------------------------------------------------------------------
void StartFrame(HWND hWnd)
{
    ・
    ・
    ・

}

(b) WinMain.cppの修正

  1. WinMain.cppからStartInit関数、StartFrame関数を移動(WinMain.cpp内からは削除)。
  2. WinMain.cpp内でしか使用しない関数(WinProc、InitApp、UpdateFrame)のプロトタイプ宣言、関数本体にstaticを付ける。
  3. WinMain.cpp内でしか使用しない変数(szWinName、szTitle)にstaticを付ける。

[修正後のWinMain.cpp]

//=============================================================================
//      2Dゲーム基本プログラム2(基本プログラムからの分割)
//=============================================================================
#include <windows.h>
#include <windowsx.h>
#include <stdio.h>
#include <ddraw.h>
#include "myDraw.h"

//-----------------------------------------------------------------------------
// マクロ定義
//-----------------------------------------------------------------------------
#define START_INIT     0
#define START_FRAME    1
#define GAME_INIT      10
#define GAME_FRAME     11

//-----------------------------------------------------------------------------
// プロトタイプ宣言
//-----------------------------------------------------------------------------
static LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
static HWND InitApp(HINSTANCE, int);
static void UpdateFrame(HWND);
void StartInit(HWND);
void StartFrame(HWND);
void GameInit(HWND);
void GameFrame(HWND);
bool HitCheck(RECT, RECT);

//-----------------------------------------------------------------------------
// 外部変数(本体は別ソース)
//-----------------------------------------------------------------------------
/* DirectDrawオブジェクト関係 */
extern LPDIRECTDRAW7 g_pDD;                 // DirectDraw オブジェクト
extern LPDIRECTDRAWSURFACE7 g_pDDSPrimary;  // プライマリ・サーフェイス
extern LPDIRECTDRAWSURFACE7 g_pDDSBack;     // バック・サーフェイス 
extern LPDIRECTDRAWSURFACE7 g_pDDSStart;    // スタート画像用サーフェイス
extern LPDIRECTDRAWSURFACE7 g_pDDSGame;     // ゲーム画像用サーフェイス

//-----------------------------------------------------------------------------
// 外部変数(本体)
//-----------------------------------------------------------------------------
/* 共通 */
BYTE g_FrameNo = START_INIT;        // フレーム選択用
BYTE KeyTbl[256];                   // キー情報
RECT ScreenRect = {0, 0, 640, 480}; // ウィンドウの矩形

//-----------------------------------------------------------------------------
// グローバル変数
//-----------------------------------------------------------------------------
/* ウィンドウ関係 */
static char szWinName[] = "Skeleton";                   // ウィンドウクラス名
static char szTitle[] = "2Dゲーム基本プログラム2";   // ウィンドウタイトル名
/* ゲーム処理用 */
RECT AngelRect;                 // 天使の矩形
int AngelWidth, AngelHeight;    // 天使の幅・高さ
int AngelX, AngelY;             // 天使の表示座標
int AngelMoveX, AngelMoveY;     // 天使の移動量
RECT GokiRect;                  // ゴキブリの矩形
int GokiWidth, GokiHeight;      // ゴキブリの幅・高さ
int GokiX, GokiY;               // ゴキブリの表示座標

//=============================================================================
//      ウィンドウメイン関数(WinMain)
//=============================================================================
int WINAPI WinMain(HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode)
{
    ・
    ・
    ・

}

//=============================================================================
//      ウィンドウプロシジャ関数(WindowProcedure)
//=============================================================================
static LRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    ・
    ・
    ・

}

//=============================================================================
//  関数名 :InitApp
//  機能概要:表示するウィンドウの定義、登録、表示
//  戻り値 :正常終了のとき1、以上終了のとき0
//=============================================================================
static HWND InitApp(HINSTANCE hThisInst, int nWinMode)
{
    ・
    ・
    ・

}

//-----------------------------------------------------------------------------
// 関数名 : UpdateFrame()
// 機能概要: 画面更新処理
//-----------------------------------------------------------------------------
static void UpdateFrame(HWND hWnd)
{
    ・
    ・
    ・

}

//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
void GameInit(HWND hWnd)
{
    ・
    ・
    ・

}

//-----------------------------------------------------------------------------
// 関数名 : GameFrame()
// 機能概要: 画面更新処理
//-----------------------------------------------------------------------------
void GameFrame(HWND hWnd)
{
    ・
    ・
    ・

}

//-----------------------------------------------------------------------------
// 関数名 : HitCheck()
// 機能概要: あたり判定関数
//-----------------------------------------------------------------------------
bool HitCheck(RECT Rect1, RECT Rect2)
{
    ・
    ・
    ・

}

確認!!

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

(c) Start.hの作成

myDraw.hと同様に、Start.cpp用のヘッダファイル「Start.h」を作成する。

  1. Start.hを作成し、WinMain.cpp内のUpdateFrame関数から呼ばれるStart処理用の関数(StartInit、StartFrame)のプロトタイプ宣言を行う。
    //-----------------------------------------------------------------------------
    // Start.cppの関数のうち、他のソースで利用される関数のプロトタイプ宣言
    //-----------------------------------------------------------------------------
    void StartInit(HWND);
    void StartFrame(HWND);
  2. WinMain.cppとStart.cppからStart処理用関数のプロトタイプ宣言を削除する。
    [修正後のWinMain.cpp]
    //-----------------------------------------------------------------------------
    // プロトタイプ宣言
    //-----------------------------------------------------------------------------
    LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);
    HWND InitApp(HINSTANCE, int);
    void UpdateFrame(HWND);
    void GameInit(HWND);
    void GameFrame(HWND);
    bool HitCheck(RECT, RECT);
  3. WinMain.cppとStart.cppでStart.hをインクルードする。

確認!!

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


[ TOP ]