スタート処理の分割と同様、ゲーム処理も分割する。(3)で作成したプログラムが正しく動作していることを確認しておくこと。
ゲーム処理系のグローバル変数および関数を配置するためのソースファイルとして、Game.cppという名前のファイルを作成する。手順は次のとおり。
これにより、中身のないファイルがプロジェクトに追加される。ここに、ゲーム処理関係のオブジェクトを配置していく。
作成したgame.cppファイルに、プログラムを記述していく。
ゲーム処理関係の関数(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"
マクロや構造体はスタート処理でも使用するため、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;
グローバル変数のうち、ゲーム処理関係の関数(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; // 敵機用当たり判定矩形
このソースに配置する関数や、このソースから呼び出す関数のプロトタイプ宣言を行う。
// プロトタイプ宣言 /* 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)内でのみ利用するもの */
ゲーム画面処理に必要な2つの関数(GameInit、GameFrame)をこのソースに配置する(WinMain.cppからコピー)。配置後、WinMain.cppからは削除する。
//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: ゲーム画面初期化処理
//-----------------------------------------------------------------------------
void GameInit(void)
{
・
・
・
}
//-----------------------------------------------------------------------------
// 関数名 : GameFrame()
// 機能概要: ゲーム画面処理
//-----------------------------------------------------------------------------
void GameFrame(void)
{
・
・
・
}
WinMain.cppを次のように修正する。
グローバル変数のうち、テクスチャ・オブジェクト、自機および敵用頂点情報配列は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[] = "ゲームを作りやすいプログラム"; // ウィンドウクラス用文字列
ゲーム画面処理系の処理を行う関数は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); // 当たり判定用矩形を用いた当たり判定処理
ゲーム処理系の処理を行う関数(GameInit、GameFrame)はGame.cppに配置したので、WinMain.cppからは削除する。
※ここまで行ったらビルドを行い、エラーが出ることなくプログラムが動作するかを確認する。
前頁と同様に、ヘッダ・ファイルを作成し、他のソースから利用できるようにプログラムを修正する。
Game.hに、Start.cppで作成した関数のうち、他のソースから利用される関数(StartInitとStartFrame)のプロトタイプ宣言を行う。
//----------------------------------------------------------------------------- // File: Game.h // Desc: Game.cppで使用するもののうち、他のソースでも使うものを宣言 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // マクロ //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // 構造体 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // グローバル変数 //----------------------------------------------------------------------------- //----------------------------------------------------------------------------- // プロトタイプ宣言 //----------------------------------------------------------------------------- void GameInit(void); // ゲーム画面初期化処理 void GameFrame(void); // ゲーム画面処理
それぞれのソースファイルで宣言していたグローバル変数やプロトタイプ宣言は、Game.hをインクルードすることで省略できる。次のように修正する。
#include "Game.h"
上記1から3までの修正を行うと、WinMain.cpp、Game.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); // 当たり判定用矩形を用いた当たり判定処理
//=============================================================================
// ゲーム処理関係の自作関数群
// 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(共通ヘッダ・ファイルの作成) |