スタート処理分割

(2)では、WinMain.cppからDirectX Graphics関係の関数を抜き出し、NKC_DGraphics.cppというファイルに作成した。同様に、スタート処理関係のグローバル変数および関数を1つのファイルにまとめる方法を解説する。(2)で作成したプログラムが正しく動作していることを確認しておくこと。

ソースファイルの追加

スタート処理系のグローバル変数および関数を配置するためのソースファイルとして、Start.cppという名前のファイルを作成する。手順は次のとおり。

  1. メニューの「プロジェクト」から「プロジェクトへ追加」、「新規作成」を選択。
  2. 新規作成ウィンドウから「C++ ソースファイル」を選択し、ファイル名を「Start.cpp」と入力後、「OK」ボタンをクリックする。

これにより、中身のないファイルがプロジェクトに追加される。ここに、スタート処理関係のオブジェクトを配置していく。

Start.cppへプログラムを記述

作成したStart.cppファイルに、プログラムを記述していく。

1.インクルード・ファイルの宣言

スタート処理関係の関数(StartInit、StartFrame)に必要なヘッダ・ファイルをインクルードする。

//=============================================================================
//  スタート処理関係の自作関数群
//  Copyright NKC Game Staff(←自分の名前) 
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>    // WindowsAPIを使用可能にする
#include <windowsx.h>
#include <d3d8.h>       // DirectX8ヘッダファイル
#include <d3dx8.h>      // D3DXヘッダファイル
#include "NKC_DGraphics.h"

2.マクロ・構造体の宣言

マクロや構造体はスタート処理でも使用するため、WinMain.cppからコピーする(WinMain.cppから削除はしない)。

// マクロ
/* ゲームの状態を識別する(フレーム番号) */
#define START_INIT     0
#define START_FRAME    1
#define GAME_INIT      10
#define GAME_FRAME     11
/* 頂点フォーマット(基本形)*/
#define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// 構造体の宣言
/* 頂点構造体 */
typedef struct _TLVERTEX {
    float           x, y, z;                //位置情報
    float           rhw;                    //頂点変換値
    D3DCOLOR        color;                  //頂点カラー
    float           tu, tv;                 //テクスチャ座標
} TLVERTX, *LPTLVERTEX;

3.グローバル変数の宣言

グローバル変数のうち、スタート処理関係の関数(StartInit、StartFrame)に必要なものを宣言する。

// グローバル変数
/* WinMain.cppで宣言されているもの */
extern HWND hWnd;                           // ウィンドウハンドル
extern BYTE g_FrameNo;                      // フレーム選択用
extern BYTE gl_KeyTbl[256];                 // キーボードの状態を格納
extern RECT gl_rcScreen;                    // ウィンドウ領域
/* 自ソースでのみ利用するもの */
static TLVERTX BackVertex[4];               // 背景用頂点情報配列

《POINT》

4.プロトタイプ宣言

このソースに配置する関数や、このソースから呼び出す関数のプロトタイプ宣言を行う。

// プロトタイプ宣言
/* WinMain.cppに存在し、Start.cppから呼び出す関数 */
void InitVertex(LPTLVERTEX, float, float, float, float, int); // 頂点情報格納
/* WinMain.cppから呼び出されるもの */
void StartInit(void);                        // スタート画面初期化処理
void StartFrame(void);                       // スタート画面処理
/* 自ソース(Start.cpp)内でのみ利用するもの */

《POINT》

5.関数の配置

スタート処理に関係する2つの関数をこのソースに配置する(WinMain.cppからコピー)。配置後、WinMain.cppからは削除する。

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

//-----------------------------------------------------------------------------
// 関数名 : StartFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void StartFrame(void)
{
    ・
    ・
    ・
}

《POINT》

WinMain.cppを修正

WinMain.cppを次のように修正する。

1.グローバル変数の修正

グローバル変数のうち、g_FrameNo、KeyTbl、gl_rcScreenはスタート処理、ゲーム処理などで利用するため、他のソースから利用できるように修正。

// グローバル変数
/* 他ソースも利用するもの */
HWND hWnd;                              // ウィンドウハンドル
BOOL g_appActive = FALSE;               // ウィンドウの状態
BYTE g_FrameNo = START_INIT;            // フレーム選択用
BYTE gl_KeyTbl[256];                    // キーボードの状態を格納
RECT gl_rcScreen = {0, 0, 640, 480};    // ウィンドウ領域
/* 自ソースでのみ利用するもの */
static char szWinName[] = "Exer007";        // ウィンドウクラス用文字列
static char szWinTitle[] = "ゲームを作りやすいプログラム"; // ウィンドウクラス用文字列
static TLVERTX BackVertex[4];               // 背景用頂点情報配列
static TLVERTX MyCharaVertex[4];            // 自機用頂点情報配列
static TLVERTX EnemyVertex[4];              // 敵用頂点情報配列
static RECT MyCharaHitRect;                 // 自機用当たり判定矩形
static RECT EnemyHitRect;                   // 敵機用当たり判定矩形

2.プロトタイプ宣言の修正

スタート処理系の処理を行う関数はStart.cppに配置し、WinMain.cppのUpdateFrame関数から呼び出して使用する。よって、見た目として次のように分けておく。

// プロトタイプ宣言
/* Start.cppから呼び出すもの */
void StartInit(void);                                   // スタート画面初期化処理
void StartFrame(void);                                  // スタート画面処理
/* 自ソースでのみ利用するもの */
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); 	// Windows関数
BOOL InitApp(HINSTANCE, int);							// ユーザー関数
BOOL UpdateFrame(void);                                 // ゲームメイン処理
void GameInit(void);                                    // ゲーム画面初期化処理
void GameFrame(void);                                   // ゲーム画面処理
void InitVertex(LPTLVERTEX, float, float, float, float, int); // 頂点情報格納
void Move(LPTLVERTEX, float, float);                    // 移動処理
void MoveCheck(RECT, LPTLVERTEX);                       // 移動範囲の制限
bool HitCheck(LPTLVERTEX, LPTLVERTEX);                  // 当たり判定処理
bool HitCheck2(LPTLVERTEX, RECT, LPTLVERTEX, RECT);     // 当たり判定用矩形を用いた当たり判定処理

3.スタート処理系の関数を削除

スタート処理系の処理を行う関数(StartInit、StartFrame)はstart.cppに配置したので、WinMain.cppからは削除する。

※ここまでの修正を行ったらビルドを行い、エラーが出ることなくプログラムが動作するかを確認する。

Start.cpp用のヘッダ・ファイルを用意する

前頁と同様に、ヘッダ・ファイルを作成し、他のソースから利用できるようにプログラムを修正する。

1.Start.hの新規作成

  1. 「プロジェクト」→「プロジェクトへ追加」→「新規作成」を選択。
  2. 新規作成ウィンドウから「C/C++ヘッダーファイル」を選択し、ファイル名に「Start.h」と入力し、位置がプロジェクトのフォルダになっていることを確認して、OKボタンをクリック。

2.Start.hを編集

Start.hにStart.cppで作成した関数のうち、他のソースから利用される関数(StartInitとStartFrame)のプロトタイプ宣言を行う。

//-----------------------------------------------------------------------------
// File: Start.h
// Desc: Start.cppで使用するもののうち、他のソースでも使うものを宣言
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// マクロ
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// 構造体
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// グローバル変数
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// プロトタイプ宣言
//-----------------------------------------------------------------------------
void StartInit(void);                          // スタート画面初期化処理
void StartFrame(void);                         // スタート画面処理

3.WinMain.cpp、Start.cppファイルの編集

それぞれのソースファイルで宣言していたグローバル変数やプロトタイプ宣言は、Start.hをインクルードすることで省略できる。次のように修正する。

  1. WinMain.cppから、スタート処理系関数のプロトタイプ宣言を削除する。
  2. Start.cppから、WinMain.cppのUpdateFrame関数から呼び出される関数(StartInitとStartFrame)のプロトタイプ宣言を削除する。
  3. WinMain.cppとStart.cppでStart.hをインクルードする。
    #include "Start.h"

確認

上記1から3までの修正を行うと、WinMain.cpp、Start.cppのヘッダ部分は次のようになる。

《WinMain.cpp》

//-------------------------------------------------------------------------------------------------
// 問題番号:Exer007
//  問題内容:ゲームを作りやすいプログラム
//  Copyright NKC Game Staff(←自分の名前) 
//-------------------------------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>	// WindowsAPIを使用可能にする
#include <windowsx.h>
#include <d3d8.h>       // DirectX8ヘッダファイル
#include <d3dx8.h>      // D3DXヘッダファイル
#include "NKC_DGraphics.h"
#include "Start.h"

// マクロ
#define WINMODE FALSE // ウィンドウモードの指定(TRUE:ウィンドウモード/FALSE:フルスクリーン)
#define SCREEN_WIDTH	640	// ウィンドウの幅
#define SCREEN_HEIGHT	480	// ウィンドウの高さ
/* ゲームの状態を識別する(フレーム番号) */
#define START_INIT      0
#define START_FRAME     1
#define GAME_INIT       10
#define GAME_FRAME      11
/* 頂点フォーマット(基本形)*/
#define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// 構造体の宣言
/* 頂点構造体 */
typedef struct _TLVERTEX {
    float           x, y, z;                //位置情報
    float           rhw;                    //頂点変換値
    D3DCOLOR        color;                  //頂点カラー
    float           tu, tv;                 //テクスチャ座標
} TLVERTX, *LPTLVERTEX;

// グローバル変数
/* 他ソースも利用するもの */
HWND hWnd;                              // ウィンドウハンドル
BOOL g_appActive = FALSE;               // ウィンドウの状態
BYTE g_FrameNo = START_INIT;            // フレーム選択用
BYTE gl_KeyTbl[256];                    // キーボードの状態を格納
RECT gl_rcScreen = {0, 0, 640, 480};    // ウィンドウ領域
/* 自ソースでのみ利用するもの */
static char szWinName[] = "Exer007";    // ウィンドウクラス用文字列
static char szWinTitle[] = "ゲームを作りやすいプログラム"; // ウィンドウクラス用文字列
static TLVERTX BackVertex[4];           // 背景用頂点情報配列
static TLVERTX MyCharaVertex[4];        // 自機用頂点情報配列
static TLVERTX EnemyVertex[4];          // 敵用頂点情報配列
static RECT MyCharaHitRect;             // 自機用当たり判定矩形
static RECT EnemyHitRect;               // 敵機用当たり判定矩形

// プロトタイプ宣言
/* 自ソースで宣言されているもの */
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); 	// Windows関数
BOOL InitApp(HINSTANCE, int);							// ユーザー関数
BOOL UpdateFrame(void);                                 // ゲームメイン処理
void GameInit(void);                                    // ゲーム画面初期化処理
void GameFrame(void);                                   // ゲーム画面処理
void InitVertex(LPTLVERTEX, float, float, float, float, int); // 頂点情報格納
void Move(LPTLVERTEX, float, float);                    // 移動処理
void MoveCheck(RECT, LPTLVERTEX);                       // 移動範囲の制限
bool HitCheck(LPTLVERTEX, LPTLVERTEX);                  // 当たり判定処理
bool HitCheck2(LPTLVERTEX, RECT, LPTLVERTEX, RECT);     // 当たり判定用矩形を用いた当たり判定処理

《Start.cpp》

//=============================================================================
//  スタート処理関係の自作関数群
//  Copyright NKC Game Staff(←自分の名前) 
//-----------------------------------------------------------------------------
#include <stdio.h>
#include <windows.h>    // WindowsAPIを使用可能にする
#include <windowsx.h>
#include <d3d8.h>       // DirectX8ヘッダファイル
#include <d3dx8.h>      // D3DXヘッダファイル
#include "NKC_DGraphics.h"
#include "Start.h"

// マクロ
/* ゲームの状態を識別する(フレーム番号) */
#define START_INIT      0
#define START_FRAME     1
#define GAME_INIT       10
#define GAME_FRAME      11
/* 頂点フォーマット(基本形)*/
#define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1)

// 構造体の宣言
/* 頂点構造体 */
typedef struct _TLVERTEX {
    float           x, y, z;                //位置情報
    float           rhw;                    //頂点変換値
    D3DCOLOR        color;                  //頂点カラー
    float           tu, tv;                 //テクスチャ座標
} TLVERTX, *LPTLVERTEX;

// グローバル変数
/* WinMain.cppで宣言されているもの */
extern HWND hWnd;                           // ウィンドウハンドル
extern BYTE g_FrameNo;                      // フレーム選択用
extern BYTE gl_KeyTbl[256];                 // キーボードの状態を格納
extern RECT gl_rcScreen;                    // ウィンドウ領域
/* 自ソースでのみ利用するもの */
static TLVERTX BackVertex[4];               // 背景用頂点情報配列

// プロトタイプ宣言
/* WinMain.cppに存在し、Start.cppから呼び出す関数 */
void InitVertex(LPTLVERTEX, float, float, float, float, int); // 頂点情報格納
/* 自ソース(Start.cpp)内でのみ利用するもの */

※ここまでの修正を行ったらビルドを行い、エラーが出ることなくプログラムが動作するかを確認する。


NEXT(DirectX Graphics処理分割) NEXT(ゲーム処理分割)