ゲーム処理分割

スタート処理の分割と同様、ゲーム処理も分割する。(3)で作成したプログラムが正しく動作していることを確認しておくこと。

ソースファイルの追加

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

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

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

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

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

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

ゲーム処理関係の関数(GameInit、GameFrame)に必要なヘッダ・ファイルをインクルードする。

//=============================================================================
//  ゲーム処理関係の自作関数群
//  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.グローバル変数の宣言

グローバル変数のうち、ゲーム処理関係の関数(GameInit、GameFrame)に必要なものを宣言する。

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

《POINT》

4.プロトタイプ宣言

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

// プロトタイプ宣言
/* WinMain.cppに存在し、Game.cppから呼び出す関数 */
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);     // 当たり判定用矩形を用いた当たり判定処理
/* WinMain.cppから呼び出されるもの */
void GameInit(void);                        // スタート画面初期化処理
void GameFrame(void);                       // スタート画面処理
/* 自ソース(Game.cpp)内でのみ利用するもの */

《POINT》

5.関数の配置

ゲーム画面処理に必要な2つの関数(GameInit、GameFrame)をこのソースに配置する(WinMain.cppからコピー)。配置後、WinMain.cppからは削除する。

//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: ゲーム画面初期化処理
//-----------------------------------------------------------------------------
void GameInit(void)
{
    ・
    ・
    ・
}

//-----------------------------------------------------------------------------
// 関数名 : GameFrame()
// 機能概要: ゲーム画面処理
//-----------------------------------------------------------------------------
void GameFrame(void)
{
    ・
    ・
    ・
}

《POINT》

WinMain.cppを修正

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

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

グローバル変数のうち、テクスチャ・オブジェクト、自機および敵用頂点情報配列はWinMain.cppから利用されることはないため、削除する。

// グローバル変数
/* 他ソースも利用するもの */
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[] = "ゲームを作りやすいプログラム"; // ウィンドウクラス用文字列

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

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

// プロトタイプ宣言
/* Game.cppから呼び出すもの */
void GameInit(void);                                    // ゲーム画面初期化処理
void GameFrame(void);                                   // ゲーム画面処理
/* 自ソースで宣言されているもの */
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); 	// Windows関数
BOOL InitApp(HINSTANCE, int);							// ユーザー関数
BOOL UpdateFrame(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.ゲーム処理系の関数を削除

ゲーム処理系の処理を行う関数(GameInit、GameFrame)はGame.cppに配置したので、WinMain.cppからは削除する。

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

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

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

1.Game.hの新規作成

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

2.Game.hを編集

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

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

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

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

//-----------------------------------------------------------------------------
// プロトタイプ宣言
//-----------------------------------------------------------------------------
void GameInit(void);                           // ゲーム画面初期化処理
void GameFrame(void);                          // ゲーム画面処理

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

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

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

確認

上記1から3までの修正を行うと、WinMain.cpp、Game.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"
#include "Game.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[] = "ゲームを作りやすいプログラム"; // ウィンドウクラス用文字列

// プロトタイプ宣言
/* 自ソースで宣言されているもの */
LRESULT CALLBACK WinProc(HWND, UINT, WPARAM, LPARAM); 	// Windows関数
BOOL InitApp(HINSTANCE, int);							// ユーザー関数
BOOL UpdateFrame(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);     // 当たり判定用矩形を用いた当たり判定処理

《Game.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 "Game.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];               // 背景用頂点情報配列
static TLVERTX MyCharaVertex[4];            // 自機用頂点情報配列
static TLVERTX EnemyVertex[4];              // 敵用頂点情報配列
static RECT MyCharaHitRect;                 // 自機用当たり判定矩形
static RECT EnemyHitRect;                   // 敵機用当たり判定矩形

// プロトタイプ宣言
/* WinMain.cppに存在し、Game.cppから呼び出す関数 */
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);     // 当たり判定用矩形を用いた当たり判定処理
/* 自ソース(Game.cpp)内でのみ利用するもの */

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


BACK(スタート処理分割) NEXT(共通ヘッダ・ファイルの作成)