文字表示


ぁーそうえいば文字表示が無かったなぁ(致命的)ということで作りました.



#include <afc/gui.hpp>


using namespace afc::gui;


window wnd;

screen scr;


// 初期化略


// これが文字表示
printer_holder<wchar_t, int> ph;


// 有効化
scr.assign(ph); // これをしなきゃらならないのは煩わしいなぁ


// 設定
ph.init(L"MS 明朝", 32, 0x00ff0000); // MS明朝,32ポイント,赤


// 描画
ph.write(L"描画しまっす");


// 上の方法だと描画時に読込んで重いので,文字を事前に読込むこともできる
ph.preload(L"にみ");
ph.preload(L"事前読込");


// 読込みはしていない(「しまっす」は既に読込んである)
ph.write(L"事前に読込みしまっす");


// フィールドを設定できます
// このフィールドからは,はみ出しません
// はみ出そうものなら途中で改行,それでもダメならあきらめます
ph.field(50, 100, 150, 200); // x, y, w, h


// 長いとで途中で表示が打ち切られます
ph.write(L"あいうえお…わをん");


// 一つのprinter_holder<>に複数の書体,複数のフォントサイズ,複数の色は持たせられません
// 一つでもパラメータが違う場合はもう一個作る必要があります
printer_holder<wchar_t, int> ph2;
ph2.init(L"MS 明朝", 32, 0x000000ff); // これは青


// printer_holder<>は中身を共有できます
// ただしフィールドは変えられます
printer_holder<wchar_t, int> ph3(ph); // phと共有

// 共有する場合は一つを初期化すればよい(shared_ptr<>のような感じ)
ph3.field(300, 100, 500, 200); // ただしfieldは変えられる


ph3.write(L"abc...");


本当は少し違って
afc::gui::directx::printer<>という文字表示クラスがあります.

printer_holer<>はこのprinter<>に対して以下のことができます.

  • printer<>をポインタの様に共有できる
  • fieldをbindしてくれる(printer_holder<>を経由してwrite等を呼ぶと自動的にfieldを補完してくれる).


この共有というのが意外に必要で,共有しないと書体,サイズ,色が全く同じ場合でも複数文字テクスチャを作ってしまいます.

共有すれば使い回しができます.


まぁこんな感じです.

とりあえず普通に使うには困りません.


唯一のネックがassignだよなぁ.

これはDirectXのデバイスを受け渡しているのですが.

たくさんの箇所で使うからいっそのことglobal変数としてしまった方がいいかもしれない.