0からのゲームプログラミング > テキスト描画 1

Back Next
更新日 2004.03.27
テキスト描画 1

 テキストを描画するには、ID3DXFont インターフェイス 等を使えば出来ますが、簡略化する為に、スケルトンから CText2D クラス を用意しています。これを使って、プログラムに得点表示を追加してみたいと思います。

 フォントの描画ですが、DirectX のバージョンが、8, 9 のものですと、ゲームでは使い物にならないくらい描画速度が遅いものでした。しかし、DirectX 9.0 SDK Update (Summer 2003) では、その点がかなり改善されています。


◆得点表示クラス

 クラス名は何でも構いませんが、ここでは CScore という名前を付けることにします。Source と Header フォルダの中に、それぞれ、Score.cpp と Score.h のファイルを新しく作り、プロジェクトに加えます


 以下、サンプルコードです。

Score.h

//====================================================================
//			CScore クラス
//--------------------------------------------------------------------
//	処理内容 : 得点表示
//	ファイル名	 : Score.h
//	作成者	 : Copyright(C) 2004 ※※ ※※
//====================================================================


#ifndef	__SCORE_H__
#define	__SCORE_H__


//====================================================================
//			CScore クラスの定義
//====================================================================
class CScore{
	CText2D			*m_pText;		// テキスト

public:
	CScore();
	~CScore();
	void Init(void);
	void Release(void);
	void Move(void);
	void Draw(void);
};


#endif


//====================================================================

 上では、CText2D クラスのポインタを定義していることに注意して下さい。


Score.cpp

//====================================================================
//			CScore クラス
//--------------------------------------------------------------------
//	処理内容 : 得点表示
//	ファイル名	 : Score.cpp
//	作成者	 : Copyright(C) 2004 ※※ ※※
//====================================================================


//====================================================================
//			プリコンパイル済みヘッダの使用
//====================================================================
#include	"..\Header\StdAfx.h"


//====================================================================
//			ヘッダファイルのインクルード
//====================================================================
#include	"..\Header\Score.h"


//====================================================================
//			CScore クラスの実装
//====================================================================

// コンストラクタ
CScore::CScore() : m_pText(NULL)
{
}


// デストラクタ
CScore::~CScore()
{
	// 解放処理
	Release();
}


// 初期化
// 引数、戻値なし。
void CScore::Init(void)
{
	if(m_pText){
		delete m_pText;
		m_pText = NULL;
	}
	m_pText = new CText2D;

	// 高さが 32 ドット のフォントを作成
	m_pText->InitFont(g_pD3DDevice, 32);
}


// 解放処理
// 引数、戻値なし。
void CScore::Release(void)
{
	if(m_pText){
		delete m_pText;
		m_pText = NULL;
	}
}


// 動作
// 引数、戻値なし。
void CScore::Move(void)
{
}


// 描画
// 引数、戻値なし。
void CScore::Draw(void)
{
	// テキストを描画する前に呼び出す。
	m_pText->Begin();

	// x座標, y座標, 色, 文字
	m_pText->Draw(0, 0, 0xffffffff, "0123456789");

	// テキストを描画した後に呼び出す。
	m_pText->End();
}


//====================================================================

 Init メンバ関数では初期化をし、Release メンバ関数では解放処理をしています。ウィンドウモード⇔フルスクリーンモードの切り替え時等に、毎回解放処理&再初期化する必要がある為に (ID3DXSprite や ID3DXFont インターフェイス等がそういう仕様です。) Release メンバ関数も追加しています。


Screen.h

	・
	・
	・

//====================================================================
//			ヘッダファイルのインクルード
//====================================================================
#include	"Jiki.h"
#include	"JikiShot.h"
#include	"Enemy.h"
#include	"Touch.h"
#include	"Explosion.h"
#include	"Score.h"

	・
	・
	・

//====================================================================
//			CScreenStage クラスの定義
//====================================================================
class CScreenStage : public CScreen{
	CJiki			m_Jiki;			// 自機
	CJikiShot		m_JikiShot;		// 自機の弾
	CEnemy			m_Enemy;		// 敵機
	CTouch			m_Touch;		// 当たり判定
	CExplosion		m_Explosion;		// 爆発
	CScore			m_Score;		// 得点

	・
	・
	・
};

	・
	・
	・

 Screen.h では、Score.h をインクルードし、CScore クラスのオブジェクトを定義しています。


ScreenStage.cpp

	・
	・
	・


// 描画の初期設定等
// 引数、戻値なし。
void CScreenStage::InitRender(void)
{
	m_Score.Init();
}


// 解放処理
// 引数、戻値なし。
void CScreenStage::Release(void)
{
	m_Score.Release();
}


	・
	・
	・


// 動作
// 引数、戻値なし。
void CScreenStage::Move(void)
{
	m_Jiki.Move();
	m_JikiShot.Move();
	m_Enemy.Move();

	// 自機の弾と敵機との当たり判定
	m_Touch.JikiShotAndEnemy();

	m_Explosion.Move();
	m_Score.Move();
}


// 描画
// 引数、戻値なし。
void CScreenStage::Draw(void)
{
	// 画面クリア
	g_pD3DDevice->Clear(0, NULL, g_pFormat->GetFlags(), D3DCOLOR_XRGB(0, 0, 0), 1, 0);

	// 描画開始
	g_pD3DDevice->BeginScene();


	// スプライト描画開始
	g_pSprite->Begin(D3DXSPRITE_ALPHABLEND);


	m_Jiki.Draw();
	m_JikiShot.Draw();
	m_Enemy.Draw();
	m_Explosion.Draw();


	// スプライト描画終了
	g_pSprite->End();


	m_Score.Draw();


	// 描画終了
	g_pD3DDevice->EndScene();

	// 画面更新
	g_pD3DDevice->Present(NULL, NULL, NULL, NULL);
}

	・
	・
	・

 ScreenStage.cpp では、以下のコードを新たに追加しています。

m_Score.Init();
m_Score.Release();
m_Score.Move();
m_Score.Draw();


 ビルド[メイク] して実行すると、画面の左上に数字が表示されます。

スクリーンショット

【スポンサード リンク】


Back Next

0からのゲームプログラミング > テキスト描画 1