がりらぼ

WindowsRuntimeの応援ブログ

DirectXによるWindowsストアアプリゲーム開発入門vol.3 テキスト簡単に描画する

プロジェクトファイルをダウンロードして、TestDirectX_3_TextEasyディレクトリ内のソリューションファイルを開いて実行しましょう。

「さむい」というテキストが左から右に移動する結果になります。
f:id:garicchi:20131219112326p:plain

DrawableText.hを見てみましょう
このクラスはテキストを簡易表示するために作った自作クラスです。

class DrawableText{
	public:
		DrawableText(wstring text, D2D1_POINT_2F position, float fontSize, ColorF color, wstring font, shared_ptr<DeviceResources> deviceResources);
		void CreateResources();
		void RelearseResources();

		ComPtr<ID2D1SolidColorBrush> m_textBrush;
		ComPtr<IDWriteTextLayout> m_textLayout;
		ComPtr<IDWriteTextFormat> m_textFormat;
		D2D1_POINT_2F m_position;

		wstring m_text;

	private:
		shared_ptr<DeviceResources> m_deviceResources;
		ColorF m_color;
		float m_fontSize;
		wstring m_fontName;
	};

テキスト表示に関するリソースやメソッドを一つのクラスにまとめました。

RendererBase.hを見てみましょう

shared_ptr<DrawableText> m_drawableText;

DrawableTextのインスタンスを定義しています。
スマートポインターではないのでdeleteが必要です。

RendererBase.cppを見てみましょう。

コンストラクタでは、DrawableTextクラスのインスタンスをnewしています

m_drawableText = make_shared<DrawableText>(L"さむい", Point2F(100.0f, 100.0f), 60.0f, ColorF(ColorF::DarkOrange), L"segoe UI", m_deviceResources);
	

第一引数で表示したいテキスト、第二引数で座標、第三引数でフォントサイズ、第四引数で色、第五引数でフォント名、第六引数にdeviceresourcesを渡します。

Renderメソッドを見てみます。

// フレームを画面に描画します。
void RendererBase::Render()
{
	//デバイスコンテキストの確保
	ID2D1DeviceContext* context = m_deviceResources->GetD2DDeviceContext();
	
	context->BeginDraw(); //描画開始

	context->DrawTextLayout(m_drawableText->m_position,
		m_drawableText->m_textLayout.Get(),m_drawableText->m_textBrush.Get());
	
	context->EndDraw();	//描画終了
	
}

ID2D1DeviceContextのDrawTextLayoutでDrawableTextクラスのフィールドを渡します。
こうすることでコードがすっきりしました。
UpdateメソッドでDrawableTextのpositionプロパティを編集して座標を変えています

//更新処理です 定期的に呼ばれるので変数の制御などはここでおこないます
void RendererBase::Update(DX::StepTimer const& timer)
{
	m_drawableText->m_position = Point2F(++m_drawableText->m_position.x,0);
}

今回はテキストを簡単に表示する方法を考えました。
オブジェクト指向としては、オブジェクトが所有するもの一つのものとしてまとめ、扱うべきです。しかしなら、DirectXの場合、SolidColorBrushなどのリソースはメモリ領域の確保に手間がかかるのでなるべく流用していきたいので、今回のようなコードは理想的でないかもしれません。