同様に、スタート処理・ゲーム処理を取り出して別ソースで管理する。まずはスタート処理を別ソースに変換する。
- Start.cppを新規作成し、プロジェクトに追加する。
- WinMain.cppのインクルード文をコピーし、Start.cppに貼り付ける。
//============================================================================= // Start処理関係の自作関数群 //============================================================================= #include <windows.h> #include <windowsx.h> #include <stdio.h> #include <ddraw.h> #include "myDraw.h"- スタート処理ではフレームナンバーのセットを行うため、WinMain.cppのマクロ文をコピーする。
//----------------------------------------------------------------------------- // マクロ定義 //----------------------------------------------------------------------------- #define START_INIT 0 #define START_FRAME 1 #define GAME_INIT 10 #define GAME_FRAME 11- スタート処理で使用する関数(StartInit、StartFrame)のプロトタイプ宣言を行う。
//----------------------------------------------------------------------------- // プロトタイプ宣言 //----------------------------------------------------------------------------- void StartInit(HWND); void StartFrame(HWND);- スタート処理では背景やゲームタイトルなどの描画を行うため、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; // ゲーム画像用サーフェイス- 各場面共通で利用する変数を外部変数として読み込む(本体はWinMain.cpp内)
/* 共通 */ extern BYTE g_FrameNo; // フレーム選択用 extern BYTE KeyTbl[256]; // キー情報 extern RECT ScreenRect; // ウィンドウの矩形- スタート処理でしか使わない変数をグローバル変数として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) { ・ ・ ・ }
- WinMain.cppからStartInit関数、StartFrame関数を移動(WinMain.cpp内からは削除)。
- WinMain.cpp内でしか使用しない関数(WinProc、InitApp、UpdateFrame)のプロトタイプ宣言、関数本体に
staticを付ける。- 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 //----------------------------------------------------------------------------- // プロトタイプ宣言 //-----------------------------------------------------------------------------staticLRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM);staticHWND InitApp(HINSTANCE, int);staticvoid 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) //=============================================================================staticLRESULT CALLBACK WinProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { ・ ・ ・ } //============================================================================= // 関数名 :InitApp // 機能概要:表示するウィンドウの定義、登録、表示 // 戻り値 :正常終了のとき1、以上終了のとき0 //=============================================================================staticHWND InitApp(HINSTANCE hThisInst, int nWinMode) { ・ ・ ・ } //----------------------------------------------------------------------------- // 関数名 : UpdateFrame() // 機能概要: 画面更新処理 //-----------------------------------------------------------------------------staticvoid UpdateFrame(HWND hWnd) { ・ ・ ・ } //----------------------------------------------------------------------------- // 関数名 : GameInit() // 機能概要: スタート処理初期化 //----------------------------------------------------------------------------- void GameInit(HWND hWnd) { ・ ・ ・ } //----------------------------------------------------------------------------- // 関数名 : GameFrame() // 機能概要: 画面更新処理 //----------------------------------------------------------------------------- void GameFrame(HWND hWnd) { ・ ・ ・ } //----------------------------------------------------------------------------- // 関数名 : HitCheck() // 機能概要: あたり判定関数 //----------------------------------------------------------------------------- bool HitCheck(RECT Rect1, RECT Rect2) { ・ ・ ・ }確認!!
ここまでやったらリビルドを行い、プログラムが正常に動くかどうか確かめよう。
myDraw.hと同様に、Start.cpp用のヘッダファイル「Start.h」を作成する。
- Start.hを作成し、WinMain.cpp内のUpdateFrame関数から呼ばれるStart処理用の関数(StartInit、StartFrame)のプロトタイプ宣言を行う。
//----------------------------------------------------------------------------- // Start.cppの関数のうち、他のソースで利用される関数のプロトタイプ宣言 //----------------------------------------------------------------------------- void StartInit(HWND); void StartFrame(HWND);- 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);- WinMain.cppとStart.cppでStart.hをインクルードする。
確認!!
ここまでやったらリビルドを行い、プログラムが正常に動くかどうか確かめよう。