この章で使用するソースファイル
C言語では、printf関数を使用して、標準出力装置(ディスプレイ)に文字列を表示する。ここではフォント・オブジェクトを使って、画面に任意の文字列を出力する方法を紹介する。
フォント・オブジェクトを生成し、描画するための関数を集めたソースファイル(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となる。このソースファイルを次のように修正する。
フォント・オブジェクトをこのソース内で使用するグローバル変数として次のように宣言する。
//=============================================================================
// ゲーム処理関係の自作関数群
// Copyright NKC Game Staff(←自分の名前)
//-----------------------------------------------------------------------------
#include "NKC_Common.h"
// マクロの定義
// グローバル変数
/* 自ソースでのみ利用するもの */
//---- 背景
static TLVERTX BackVertex[4]; // 頂点情報配列
//---- 自機
static STATUS MyChara; // 自キャラステータス情報
//---- その他
static ID3DXFont* g_Font1 = NULL; // フォントオブジェクト
・
・
・
宣言したフォント・オブジェクト(g_Font1)を初期化する。初期化の際に指定するのは「使用するフォント」「1文字の幅」「1文字の高さ」である。ゲーム画面初期化処理関数(GameInit)内で、次のように初期化を行う。
//-----------------------------------------------------------------------------
// 関数名 : GameInit()
// 機能概要: ゲーム画面初期化処理
//-----------------------------------------------------------------------------
void GameInit(void)
{
・
・
・
//--------------------------------------------------- 初期化
/* フォント・オブジェクト */
InitFont(&g_Font1, "MS P明朝", 16, 32);
・
・
・
}
作成したオブジェクトは、使わなくなったら開放しなければならない。この場合、ゲーム画面終了時に開放するのがいいだろう。次のように開放を行う。
//-----------------------------------------------------------------------------
// 関数名 : 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
}
ゲーム中に任意の文字列を出力する。例えば「すた〜と!!」という文字列を任意の座標に出力するには、次のようにプログラムする。
//-----------------------------------------------------------------------------
// 関数名 : 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(); // 自機
//--------------------------------------------------- 当たり判定
}
以上の修正を行い、ゲーム画面に指定した文字列が正しく表示されるかを確かめる。
フォント・オブジェクトの初期化を見てわかるとおり、フォント・オブジェクトは「使用するフォント」と「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));
| BACK(テクスチャ・アニメーション) | NEXT(数字を画像で用意し、描画する) |