フォント・オブジェクト

この章で使用するソースファイル

C言語では、printf関数を使用して、標準出力装置(ディスプレイ)に文字列を表示する。ここではフォント・オブジェクトを使って、画面に任意の文字列を出力する方法を紹介する。

NKC_Font.cppの組み込み

フォント・オブジェクトを生成し、描画するための関数を集めたソースファイル(NKC_Font.cpp、NKC_Font.h)を用意したので、それを組み込む方法を紹介する。

ソースファイルをダウンロードして解凍し、プロジェクトに追加後、NKC_Common.hを次のように修正する。

//-----------------------------------------------------------------------------
// 共通ヘッダ・ファイル
//  Copyright NKC Game Staff(←自分の名前) 
//-----------------------------------------------------------------------------
・
・
・
// 自作ソースファイルの組み込み
#include "NKC_Public.h"
#include "NKC_DGraphics.h"
#include "NKC_Font.h"
#include "Start.h"
#include "Game.h"

使い方

例えばゲーム画面で「すた〜と!!」という文字を任意の座標に出すことを考える。ゲーム画面なので、修正するソースファイルはGame.cppとなる。このソースファイルを次のように修正する。

1.フォント・オブジェクトの宣言

フォント・オブジェクトをこのソース内で使用するグローバル変数として次のように宣言する。

//=============================================================================
//  ゲーム処理関係の自作関数群
//  Copyright NKC Game Staff(←自分の名前) 
//-----------------------------------------------------------------------------
#include "NKC_Common.h"

// マクロの定義

// グローバル変数
/* 自ソースでのみ利用するもの */
//---- 背景
static TLVERTX BackVertex[4];       // 頂点情報配列
//---- 自機
static STATUS MyChara;              // 自キャラステータス情報
//---- その他
static ID3DXFont* g_Font1 = NULL;   // フォントオブジェクト
・
・
・

2.フォント・オブジェクトの初期化

宣言したフォント・オブジェクト(g_Font1)を初期化する。初期化の際に指定するのは「使用するフォント」「1文字の幅」「1文字の高さ」である。ゲーム画面初期化処理関数(GameInit)内で、次のように初期化を行う。

//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: ゲーム画面初期化処理
//-----------------------------------------------------------------------------
void GameInit(void)
{
    ・
    ・
    ・
    //--------------------------------------------------- 初期化
    /* フォント・オブジェクト */
    InitFont(&g_Font1, "MS P明朝", 16, 32);
    ・
    ・
    ・

}

《POINT》

3.フォント・オブジェクトの開放

作成したオブジェクトは、使わなくなったら開放しなければならない。この場合、ゲーム画面終了時に開放するのがいいだろう。次のように開放を行う。

//-----------------------------------------------------------------------------
// 関数名 : GameFrame()
// 機能概要: ゲーム画面処理
//-----------------------------------------------------------------------------
void GameFrame(void)
{
    //--------------------------------------------------- 前処理
    /* 自キャラのアニメーション */
    if ( gl_nowTime - MyChara.time > ANIMATION_TIMING ) ChangeAnime(&MyChara);

    //--------------------------------------------------- 描画
    BackDraw(); // 背景
    MyCharaDraw(); // 自機

    //--------------------------------------------------- 移動処理
    MyCharaMove(); // 自機

#ifdef DEBUG
    //--------------------------------------------------- ステージ切り替え(削除予定)
    if ( gl_KeyTbl[VK_F10] & 0x80 ) {
        RELEASE(g_Font1); // フォント・オブジェクトの開放
        ReleaseGameTexture();
        g_FrameNo = START_INIT;
    }
#endif

}

4.文字列を出力

ゲーム中に任意の文字列を出力する。例えば「すた〜と!!」という文字列を任意の座標に出力するには、次のようにプログラムする。

//-----------------------------------------------------------------------------
// 関数名 : GameFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void GameFrame(void)
{
    //--------------------------------------------------- 前処理
    /* 自キャラのアニメーション */
    if (gl_nowTime - MyChara.time > ANIMATION_TIMING) ChangeAnime(&MyChara);

    //--------------------------------------------------- 描画
    BackDraw(); // 背景
    MyCharaDraw(); // 自機
    DrawText(g_Font1, "すた〜と!!", 50, 100, D3DCOLOR_XRGB(255,0,255));

    //--------------------------------------------------- 移動処理
    MyCharaMove(); // 自機

    //--------------------------------------------------- 当たり判定

}

《POINT》

以上の修正を行い、ゲーム画面に指定した文字列が正しく表示されるかを確かめる。

複数の文字列を描画するには?

フォント・オブジェクトの初期化を見てわかるとおり、フォント・オブジェクトは「使用するフォント」と「1文字の大きさ」を指定する。つまり、1つのフォント・オブジェクトを使って複数の文字列を任意の位置に表示できる

//-----------------------------------------------------------------------------
// 関数名 : GameFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void GameFrame(void)
{
    //--------------------------------------------------- 前処理
    /* 自キャラのアニメーション */
    if (gl_nowTime - MyChara.time > ANIMATION_TIMING) ChangeAnime(&MyChara);

    //--------------------------------------------------- 描画
    BackDraw(); // 背景
    MyCharaDraw(); // 自機
    DrawText(g_Font1, "よ〜い・・・", 50, 100, D3DCOLOR_XRGB(255,0,255));
    DrawText(g_Font1, "すたーと!!", 50, 200, D3DCOLOR_XRGB(255,0,255));

    //--------------------------------------------------- 移動処理
    MyCharaMove(); // 自機

    //--------------------------------------------------- 当たり判定

}

複数のフォント・オブジェクトを利用するには?

先にも説明したとおり、フォント・オブジェクトは「フォント・タイプ」と「文字の大きさ」を指定する。よって、1つの画面でフォント・タイプや文字の大きさを切り替えて文字列を描画したい場合、それぞれのタイプのフォント・オブジェクトを作成しなければならない。

// グローバル変数(自ソースでのみ使用するもの)
static char szBackImg[] = "back1.bmp";		// 背景画像ファイル名
static char szMyCharaImg[] = "chara1.bmp";	// 自キャラファイル名
static ID3DXFont* g_Font1 = NULL;			// フォントオブジェクト
static ID3DXFont* g_Font2 = NULL;			// フォントオブジェクト
static STATUS MyChara;						// 自キャラステータス情報
・
・
・
//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: ゲーム画面初期化処理
//-----------------------------------------------------------------------------
void GameInit(void)
{
    ・
    ・
    ・
    //--------------------------------------------------- 初期化
    /* フォント・オブジェクト */
    InitFont(&g_Font1, "MS P明朝", 16, 32);
    InitFont(&g_Font2, "MS ゴシック", 12, 24);
    ・
    ・
    ・

}
・
・
・
//-----------------------------------------------------------------------------
// 関数名 : GameFrame()
// 機能概要: スタート画面処理
//-----------------------------------------------------------------------------
void GameFrame(void)
{
    //--------------------------------------------------- 前処理
    /* 自キャラのアニメーション */
    if (gl_nowTime - MyChara.time > ANIMATION_TIMING) ChangeAnime(&MyChara);

    //--------------------------------------------------- 描画
    BackDraw(); // 背景
    MyCharaDraw(); // 自機
    DrawText(g_Font1, "よ〜い・・・", 50, 100, D3DCOLOR_XRGB(255,0,255));
    DrawText(g_Font2, "すたーと!!", 50, 200, D3DCOLOR_XRGB(255,0,255));

    //--------------------------------------------------- 移動処理
    MyCharaMove(); // 自機

    //--------------------------------------------------- 当たり判定

#ifdef DEBUG
    //--------------------------------------------------- ステージ切り替え(削除予定)
    if ( gl_KeyTbl[VK_F10] & 0x80 ) {
        RELEASE(g_Font1); // フォント・オブジェクト1の開放
        RELEASE(g_Font2); // フォント・オブジェクト2の開放
        ReleaseGameTexture();
        g_FrameNo = START_INIT;
    }
#endif

}

変数内の数字を描画するには?

例えばスコアなど、変数に格納されている値をフォント・オブジェクトで描画するには、次のように行う。

char buff[80];

wsprintf(buff, "SCORE %08d", score);
DrawText(g_Font1, buff, 50, 100, D3DCOLOR_XRGB(255,0,255));

《POINT》


BACK(テクスチャ・アニメーション) NEXT(数字を画像で用意し、描画する)