今回は、文字書きます(今更かよー)
デバックやパラメータ表示、ノベルゲームには必須の処理になります

今回使うファイルは次のようになってます。どぞー(-ω-)つ旦
filedirect3d.h
filedirect3d.cpp
filefont.cpp(WinMain関数があるアプリケーション本体)

zipでほしい人はこちら
filefont.zip

文字を書くDirectXTextクラスはwinmain側にまとめてあります
direct3d.cppとdirect3d.hは前回と同じで変更はありません
font.cppは次のようになります

#define _CRT_SECURE_NO_WARNINGS
#define  _CRT_NON_CONFORMING_SWPRINTFS
#include <vector>

#include <Windows.h>
#include <tchar.h>

#include "direct3d.h" 

////////////////////////////////////////////////

// テキスト描画クラス
class DirectXText 
{
private:
	ID3DXFont*			pFont;	// Direct3Dフォント
	RECT				Rect;	// 描画領域
	std::vector<TCHAR>	Buf;	// 文字列バッファ
public:

	// コンストラクタ
	DirectXText();
	// デストラクタ
	virtual ~DirectXText();

	// DirectXフォント作成
	bool Create(IDirect3DDevice9* pD3DDevice,int FontHeight = 16);

	// 文字列の描画
	void Draw(DWORD Color,int x,int y,const TCHAR* Str,...);
};

// コンストラクタ
DirectXText::DirectXText()
{
	pFont = NULL;
}

// デストラクタ
DirectXText::~DirectXText()
{
	if(pFont != NULL)
		pFont->Release();
}

// DirectXフォント作成
bool DirectXText::Create(IDirect3DDevice9* pD3DDevice,int FontHeight)
{
	HFONT	hFont = NULL;	// フォントハンドル
	LOGFONT	LogFont ={};	// フォント構造体

	// デフォルトフォント取得
	hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
	// デフォルトフォント情報取得
	GetObject( hFont, sizeof(LOGFONT), &LogFont);
	// DirectXフォント作成
	if(FAILED(D3DXCreateFont(pD3DDevice, 
		FontHeight,					// 文字高さ
		LogFont.lfWidth,			// 文字幅
		LogFont.lfWeight,			// フォントの太さ
		0,							// ミップマップレベル
		LogFont.lfItalic,			// イタリックフラグ
		LogFont.lfCharSet,			// 文字セット
		LogFont.lfOutPrecision,		// 実際のフォントと目的のフォントの特性の一致方法
		LogFont.lfQuality,			// クォリティ
		LogFont.lfPitchAndFamily,	// ピッチとファミリインデックス
		LogFont.lfFaceName,			// フォント名
		&pFont)))
	{
		return false;
	}

	return true;
}

// 文字列の描画
void DirectXText::Draw(DWORD Color,int x,int y,const TCHAR* Str,...)
{
	va_list args;
	va_start( args, Str );					// 可変引数の最初の要素を格納する
	int len = _vsctprintf( Str, args ) + 1;	// 文字数カウント、ヌル文字分加える
	if(Buf.size() < (UINT)len)
		Buf.resize(len);						// 文字サイズ分動的にメモリ確保
	_vstprintf( &Buf[0], Str, args );			// 文字を整形する

	SetRect( &Rect, 0,0,0,0 );
	// 描画領域サイズ取得
	pFont->DrawText(NULL, &Buf[0], -1, &Rect, DT_LEFT | DT_CALCRECT, Color);
	// 本描画
	Rect.left += x;
	Rect.right += x;
	Rect.top += y;
	Rect.bottom += y;
	pFont->DrawText(NULL, &Buf[0], -1, &Rect, DT_LEFT, Color);
}

////////////////////////////////////////////////

// ウィンドウプロシージャ、ウィンドウに対するメッセージ処理を行う
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam){
	
	switch(msg){
		// ウィンドウが破棄されたとき
	case WM_DESTROY:
		PostQuitMessage(0);	// WM_QUITメッセージをメッセージキューに送る
		return 0;
	}
	// デフォルトのメッセージ処理を行う
	return DefWindowProc(hWnd, msg, wParam, lParam);
}

// WinMain関数(アプリケーションの開始関数)
// コンソールアプリケーションと違い、コンソールを開かない
int _stdcall WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	const TCHAR* WC_BASIC = _T("BASIC_WINDOW");
	// シンプルウィンドウクラス設定
	WNDCLASSEX wcex ={sizeof(WNDCLASSEX), CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS,WndProc, 0,0,hInstance,
		(HICON)LoadImage(NULL,MAKEINTRESOURCE(IDI_APPLICATION),IMAGE_ICON,0,0,LR_DEFAULTSIZE | LR_SHARED),
		(HCURSOR)LoadImage(NULL,MAKEINTRESOURCE(IDC_ARROW),IMAGE_CURSOR,0,0,LR_DEFAULTSIZE | LR_SHARED), 
		(HBRUSH)GetStockObject(WHITE_BRUSH), NULL, WC_BASIC , NULL};

	// シンプルウィンドウクラス作成
	if(!RegisterClassEx(&wcex)) 
		return false;

	// ウィンドウ幅、高さはディスプレイに依存する。普通は4:3
	const int WINDOW_WIDTH = 640;
	const int WINDOW_HEIGHT = 480;
	// ウィンドウの作成
	HWND hWnd = CreateWindowEx(0,WC_BASIC,
		_T("Application"), WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_VISIBLE,
		CW_USEDEFAULT,CW_USEDEFAULT,WINDOW_WIDTH,WINDOW_HEIGHT,NULL,NULL,hInstance,NULL);

///////////////////////////////////////////////////////////////////////////////////////////////

	////////////////////////////////////
	//	Direct3Dの初期化
	////////////////////////////////////
	Direct3D direct3d;
	direct3d.Create(hWnd,WINDOW_WIDTH,WINDOW_HEIGHT);

	////////////////////////////////
	// フォント作成
	////////////////////////////////
	DirectXText text;
	text.Create(direct3d.pDevice3D,32);

///////////////////////////////////////////////////////////////////////////////////////////////
		
	// メッセージループ
	MSG msg = {}; 
	while(msg.message != WM_QUIT) {
		// アプリケーションに送られてくるメッセージをメッセージキューから取得する
		if(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
			DispatchMessage(&msg);	// アプリケーションの各ウィンドウプロシージャにメッセージを転送する
		}
		// メッセージ処理をしていないとき
		else{
			//(ここにDirectXの処理を書く)

///////////////////////////////////////////////////////////////////////////////////////////////

			// 描画開始
			if(SUCCEEDED(direct3d.pDevice3D->BeginScene()))
			{
				DWORD ClearColor = 0xff808080;	// 背景クリア色
				// 背景クリア
				direct3d.pDevice3D->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER, ClearColor, 1.0f, 0 );
		
				// 文字描画
				text.Draw(0xffff0000,0,0,_T("Hello DirectX \n"));

				// 描画終了
				direct3d.pDevice3D->EndScene();
			}
			// 描画反映
			direct3d.pDevice3D->Present( NULL, NULL, NULL, NULL );

///////////////////////////////////////////////////////////////////////////////////////////////
		}
	}	
	return 0;
}

実行結果は次のようになります
文字が書かれているはずです
font.jpg

前:DirectX講座20回
次:DirectX講座22回

選択肢 投票
ミッションコンプリートセカンド 1  
またお前か 1  
またおm・・・誰だおまえは!? 6  

添付ファイル: filefont.zip 311件 [詳細] filefont.cpp 416件 [詳細] filedirect3d.h 468件 [詳細] filedirect3d.cpp 540件 [詳細] filefont.jpg 319件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-03-14 (水) 11:09:24