はかせのラボ

私の頭の中を書いていく雑記ブログです

落ちモノパズル フォント変更を出来るようにした

あいさつ

どうも、はかせです。
今回は文字のフォントを変えれるようにしました。

文字のフォントを変える

私の今まで実装してきた文字まわりの機能は以下の記事にあります↓
hakase0274.hatenablog.com
hakase0274.hatenablog.com

記事を見てもらえばわかると思うんですがフォントの表示自体はできていたんですよ。

使うフォントをプログラムにべた書きすればね

今までもそれっぽい機能はあったんですがまともに機能できておらず、
結局使う文字のフォントはプログラムにべた書きしてきました。
ただゲーム全体通して全て同じフォントで作るっていうのは無理があると思います。

なのでちゃんと適用できるようにしようねって感じです。
といってもそんな難しいことはしていません。
やったことは単純でLOGFONT構造体のlfFaceNameに
フォントの名前を格納しました。

// フォントハンドルの生成
auto fontSize = 64;
LOGFONT lf =
{
	fontSize, 0, 0, 0, 0, 0, 0, 0,
	SHIFTJIS_CHARSET, OUT_TT_ONLY_PRECIS, CLIP_DEFAULT_PRECIS,
	PROOF_QUALITY, FIXED_PITCH | FF_MODERN,
        //これだと先頭1文字しかとれないからだめだった
	//*fontName
};
//LOGFONT構造体が持つlfFaceName配列にフォント名を格納
auto loopCount = 0;
//std::wstringは実装的にvectorと大差なくiteratorつかって全走査できる
for(auto f:fontName)
{
	lf.lfFaceName[loopCount] = f;
	loopCount++;
}
HFONT hFont = CreateFontIndirect(&lf);

今までもフォント名を受け取って適用しようとしていたんですが、
コメントにもあるようにあの書き方だと先頭1文字しか拾えないんですよね。
それでどうやったら全部適用できるかなーって色々試したんですが、
結局コンストラクタ内ではべた書き以外はできませんでした。

なのでコンストラクタの後で別にフォント名を代入しています。
lfFaceNameはWCHARの配列です。
なのでstd::wstringで渡ってきた文字列をforループで代入しています。

では実際にフォントが変わるか試してみます。

auto textObj = Instantiate();
auto transform = textObj->GetTransform();
transform->Position = DirectX::XMFLOAT3(-0.5f, 0.0f, 0.0f);
transform->Scale = DirectX::XMFLOAT3(0.5f,0.5f,0.5f);
auto text = textObj->AddComponent<DXText>();
text->UpdateText(_T("あんずもじ"),_T("あんずもじ"));
textObj->InitializeComponent();
textObj->SetEnable(true);

auto textObj2 = Instantiate();
auto transform2 = textObj2->GetTransform();
transform2->Position = DirectX::XMFLOAT3(-0.5f, -0.5f, 0.0f);
transform2->Scale = DirectX::XMFLOAT3(0.5f, 0.5f, 0.5f);
auto text2 = textObj2->AddComponent<DXText>();
text2->UpdateText(_T("MS P明朝"), _T("MS P明朝"));
textObj2->InitializeComponent();
textObj2->SetEnable(true);

UpdateTextの第2引数がフォント名です。

f:id:hakase0274:20190305223102p:plain
ちゃんと違うフォントで表示されるようになりました。
めでたしめでたし

手放しで喜ぶことは出来なかった

auto textObj = Instantiate();
auto transform = textObj->GetTransform();
transform->Position = DirectX::XMFLOAT3(-0.5f, 0.0f, 0.0f);
transform->Scale = DirectX::XMFLOAT3(0.5f,0.5f,0.5f);
auto text = textObj->AddComponent<DXText>();
text->UpdateText(_T("あんずもじ"),_T("あんずもじ"));
textObj->InitializeComponent();
textObj->SetEnable(true);

auto textObj2 = Instantiate();
auto transform2 = textObj2->GetTransform();
transform2->Position = DirectX::XMFLOAT3(-0.5f, -0.5f, 0.0f);
transform2->Scale = DirectX::XMFLOAT3(0.5f, 0.5f, 0.5f);
auto text2 = textObj2->AddComponent<DXText>();
text2->UpdateText(_T("あんずもじ"), _T("MS P明朝"));
textObj2->InitializeComponent();
textObj2->SetEnable(true);

f:id:hakase0274:20190305223512p:plain

・・・おや?

あとがき

今回は文字のフォントを変えれるようにしました。
最初は何やっても変わらないorzってなっていましたが
理由がわかれば後は早かったですね。

最後のやつはおおよその見当はついています。
(おそらくキャッシュに問題あり)
あんまり詳しく書くとまた誤認逮捕になるのでそんな詳しくは書きません。

ただ結構根元の所弄る必要がありそうなので、
解決には少し時間がかかりそうです。

それでは今回はこの辺でノシ