第5章 キャラクタ構造体を使う

5-3.ステータス情報初期化関数のすすめ

初期化処理では、キャラクタ別に各種ステータスを設定するため、非常に長くなってしまう。初期化する内容はどのキャラクタでも大体同じなので、初期化用の関数を作成すると便利(かもしれない)。

(a) ステータス情報初期化関数を作成する

構造体変数のポインタと、ステータス情報の各値を引数にした初期化用の関数を作成する。

[ステータス情報初期化関数]

//-----------------------------------------------------------------------------
// 関数名 : StatusInit()
// 機能概要: ステータス情報初期化
//-----------------------------------------------------------------------------
void StatusInit(STATUS *status, int left, int top, int right, int bottom,
     int hleft, int htop, int hright, int hbottom,
     int x, int y, int move_x, int move_y)
{
    SetRect(&status->rect, left, top, right, bottom);
    SetRect(&status->hitrect, hleft, htop, hright, hbottom);
    status->width = status->rect.right - status->rect.left;
    status->height = status->rect.bottom - status->rect.top;
    status->x = x;
    status->y = y;
    status->move_x = move_x;
    status->move_y = move_y;

}
※キャラクタの幅と高さは計算で求めている。

[アロー演算子]
構造体ポインタ変数の値を参照するには*status.widthではなく、アロー演算子を用いstatus->widthと表現する。

(b) 初期化処理でステータス情報初期化関数を利用する

作成した関数のプロトタイプ宣言を行った後、初期化処理(GameInit関数)でステータス情報初期化関数を利用してキャラクタの各種ステータス情報を初期化する。

[ステータス情報初期化関数を利用した初期化処理]

StatusInit(&Angel, 0, 608, 48, 656, 4, 4, 40, 40, 310, 230, 4, 4); // 天使

※引数にキャラクタの幅と高さは含まれていないことに注意!!

(c) まとめ

3-4のプログラムにステータス情報初期化関数を追加して初期化処理を修正すると、Game.cppは次のようになる。

[修正後のGame.cpp]

//=============================================================================
//	Game処理関係の自作関数群
//=============================================================================
#include "common.h"

//-----------------------------------------------------------------------------
// プロトタイプ宣言(ソース内でしか使わないもの)
//-----------------------------------------------------------------------------
static void ScreenOut(void);
static void CharMove(void);
static void ScreenHitCheck(void);
static void CharHitCheck(void);
static bool HitCheck(RECT, RECT);
static void StatusInit(STATUS*, int, int, int, int, int, int, int, int, int, int, int, int);

//-----------------------------------------------------------------------------
// ゲーム処理用グローバル変数
//-----------------------------------------------------------------------------
static STATUS Angel;    // 天使
    ・
    ・
    ・
//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: スタート処理初期化
//-----------------------------------------------------------------------------
void GameInit(HWND hWnd)
{
    //------------------------------------------------------- 各変数の初期化
    /* 天使(カーソルキーで移動) */
    StatusInit(&Angel, 0, 608, 48, 656, 4, 4, 40, 40, 310, 230, 4, 4);
    /* ゴキブリ(動かない) */
    ・
    ・
    ・

※初期化処理もすっきりした

確認!!

Game.cppにステータス情報初期化用関数を作成し、初期化処理をその関数で行うようプログラムを修正し、正常に動くかどうか確かめよう。


[ TOP ]