退廃的ソースコードコンテナ

ゲームシステムを組むのが好きな人の備忘録

【DirectX】DirectX11で文字を表示できるDirectWriteのクラスを作った【DirectWrite】

皆さんこんにちは。

DirectXの環境で開発するとき、文字の表示方法ってどうしていますか?

一番簡単なのが別のソフトを使ってテクスチャに文字を書き込み、表示する方法だと思います。

しかし、実はMicrosoftが文字を描画するAPIを用意しています。

 

それがDirectWriteです。

docs.microsoft.com

 

DirectWrite自体はMicrosoftチュートリアルを用意しているのですが、

今回は、自分が作ってみたすぐに使えるDirectWriteクラスを紹介します。

最後までお読み頂ければ幸いです。

 

アップグレード版の紹介

フォントファイルからフォントの読み込み可能にしたバージョンを公開しました。

DirectWriteの軽い解説も載っているので、ご一緒にご覧ください。

islingtonsystem.hatenablog.jp

 

参考サイト

こちらのサイトに掲載されているソースコードを参考にさせて頂きました。

ありがとうございます。

dioltista.blogspot.com

www.wabiapp.com

 

目次

 

ソースコード

ヘッダーファイル

gistf55bd26af77e21a76a1282b2e619ae1f

 

ソースファイル

gist5cb1b4dc325caf80ea35e88faad9a281

 

初期設定

バイスの作成をDirect2D対応に合わせる

まず、DirectX初期設定の際に行う、バイスの設定を変更します。

DirectWriteDirect2Dの技術も使っており、Direct3D共存させる必要があります。

 

そのため、D3D11CreateDeviceもしくはD3D11CreateDeviceAndSwapChain関数の第4引数を変更します。

第4引数を画像のように変更する

変更先の値は D3D11_CREATE_DEVICE_BGRA_SUPPORT です。

D3D11_CREATE_DEVICE_FLAG型のenumでサポートされています。

docs.microsoft.com

 

また、初期設定を行ったクラスで宣言したIDXGISwapChainの変数は、

DirectWrite.cppの128行目にあるバックバッファの設定で必要になります。

 

IDXGISwapChain型の変数を取得できる関数などを用意してください。

 

読み込むライブラリを追加する

includeと読み込むライブラリを追加

次に、includeファイルと読み込むライブラリを追加します。

追加場所はmain.hのような、多くの場所で読み込むヘッダーファイルが良いと思います。

 

以下はコピペ用です。

#include <dwrite.h>                
#pragma comment(lib,"d2d1.lib")    
#pragma comment(lib,"dwrite.lib")

 

使用方法

フォントの初期化

初期化の参考例

初期設定を終えてクラスを追加後、文字描画を扱うクラスで初期設定を行ってください。


まず、フォントデータの初期化です。

DirectWriteの描画に使う文字の大きさフォント書体などを設定します。

 

こちらはコンストラクタで初期設定が行われるため、

デフォルト設定とは違うフォントデータを扱いたい場合は個別で設定してください。

なお、デフォルト設定についてはDirectWrite.hにあるFontData構造体をご覧ください。

 

次に、DirectWrite型の変数を初期化します。

DirectWrite型の変数は文字描画を扱うクラスで宣言してください。

コンストラクタの引数には、先程設定したフォントデータを入れてください

 

そして、最後に必ず、DirectWrite型の変数からInitを呼んで下さい

InitはDirectWriteの初期化を行っている関数なので、一度は必ず呼んで下さい

 

描画処理

座標を指定して描画

座標を指定して描画

描画方法は2パターンあり、まず一つ目は描画座標を指定して描画する方法です。

D3DXVECTOR2型でX軸とY軸を指定し、そこから1文字目がスタートします。

 

文字が画面サイズを超える場合、画面端に来ると自動的に改行されます。

 

座標範囲を指定して描画

座標を指定して描画

もう一つは座標範囲を指定して描画する方法です。

D2D1::RectF関数を使用して範囲をします。

 

文字が座標範囲を超えた場合、自動的に改行されます。

座標範囲は左、上、右、下の順に指定でき、指定した四角の中に描画するイメージです。

 

フォントを変更する

フォントを変更

フォントを変更する場合、SetFont関数を呼んで下さい。

引数はFontData型で、設定方法は初期化の際に行った手順と同じです。

 

実行例

実行が成功した場合

実行が成功した場合、画像のように画面に文字が表示されると思います。

フォントサイズや描画位置は変更できるため、表示されない場合は「背景と同じ色ではないか」や「座標範囲がおかしくないか」などを見直してみてください。

 

文字を動的に変更する

文字は動的に変更できるため、

このようにボタンを押すと文字を変更なんてこともできます。

 

フォントの追加方法について

DirectWrite.hにフォント管理のenumと配列が存在する

フォントを追加したい場合、DirectWrite.hにあるフォント名とフォントリストを変更してください。

DirectWriteの文字描画に使う関数ではフォント名を文字列で管理しているため、

文字列でフォント名を指定する必要があります。

 

それを同時に、引数に使うenumを追加するため、フォントリストにも、

同様にフォント名に対応する要素を追加してください。

 

なお、フォント名とフォントリストの要素番号は同じでなくてはなりません。

例えば、4番目にメイリオを追加したらenumの4番目にもメイリオを追加が必要です。

 

また、動作するPCに指定のフォントが入っていないと正しく表示されません

ゲームを配布する場合、フォントの埋め込みなどが必要なので調べてみてください。

 

最後に

今回はDirectX11環境での、DirectWriteを簡単に使える自作クラスを紹介しました。

あくまで推奨は自分が開発した環境のDirectX11ですが、他のバージョン環境でも改造すれば使える可能性はあるため、試してみてください。

 

最後までお読み頂き、ありがとうございました。

よろしければ、この記事の内容をご活用ください。

 

免責事項

※ Direct11以外のバージョンでも使える可能性はありますが、自分が制作した環境がDirect11のため、あくまで推奨はDirect11環境とさせて頂きます。その他のバージョンでは各自試してみてください。

 

※このクラスに関する不具合が見つかった場合、責任は負いかねます。改変はご自由にしていただいて構いませんので、各自で編集するかコメント欄でお伝えください。また、機能を全て活用したわけではないので、DirectWriteで用意されている未実装の機能は各自お好きに追加してみてください。