はい。DirectXと日々戦っております。
こないだDrectInput8を使った入力管理クラスを作りました。
で、昨日ようやくいくつかの拡張機能を持った文字列出力クラスが完成しました。
基本的に後にも使うことが予想されるプログラムの部品はこれからも以下の事に気を付けて作っていこうかと思います。
①ややこしい初期化のようなことはしなくても最低限の機能は使えるように作る。
②それでいて機能の拡張度合いが高い
③勉強しながらなのであとあと作り直すことが多分出てくる。だからそうだとしても部分的な最小限の書き換えで済むように作る
・・・てな感じを目標に。
今回作ったのはMyFont::PictureStringクラス。こいつは単純な話cout的なノリで画面に文字列を表示するただそれだけのクラスです。
coutでできることは全部できます(もちろんマニピュレーターも使えます)
このクラスはID3DXFontを使わないのがミソです。新しいスタイルの文字が与えられるたびにGetGlyphOutline関数を使って文字の「絵」を作り、それをハッシュテーブルに登録します。
で、それらの絵を毎フレーム描写するだけ。メモリは多少余計に使うが高速というのを目標に。(そうはいっても画面に表示できる文字数なんて限られてるわけなんですけどね)
作ったのはこんな感じ。
class CharTexture ・・・文字の絵を扱うクラス。一つのクラスが1文字を格納する。文字とスタイルを入力するとテクスチャを自動で作ってくれる
class CharBoard ・・・文字を描写するためには頂点やどこに描写するかなどの情報がいる。こいつは絵の貼り付け先のただの板。メンバにCharTextureを持ってる
class PictureString ・・・頑張って作った奴。こいつは内部に文字列を描くための黒板(レンダリング用のテクスチャ)とメッシュを持ってる
こいつにcout的に文字列を与えると文字列を一文字一文字に分解し、新しい文字を見つけたらCharBoardを作っていく。
RenderToTexture関数を呼ぶと中の黒板に文字列を描写。でRender関数を呼ぶと任意の場所に黒板を描写できるというわけ。
class psof ・・・オマケ。自作のマニピュレーター。PictureStringに流し込むと描写する文字のスタイル(斜体とかサイズとか色とか)を変更したり、行間を変更したり文字の描写に使うシェーダを変更したりできる。
ただし拡張性を持たせるためにPictureStringにはメッシュを交換できる機能を、CharBoardとPictureStringにはシェーダを任意に設定できるようにした。
こうしとけば板じゃなくて円柱に文字列を描写したりもできる。
・・・てな感じです。
次に作るのは!!
・・・そろそろDirect3D側のフレームワークを考えようか・・・今んとこめんどくさいAddRefとReleaseは全くやらんでいいように工夫はしてあるけれども、現状だとデバイスがロストすると詰む。
てな訳でポインタを工夫して最低限デバイスのロスト位では詰まないようにしないと・・・しかし管理クラスがいるな。
Direct3Dをシングルトンパターンでラップして・・・ってやろうかな。最近コレばっかな気がするwぶっちゃけDXUTがもうちょっと使いやすかったらいいんだけれども。
コールバック関数爆発しろ。
てな訳で次はフレームワーク。その次はファイルのロードクラス!(でもよく考えたら前に作ったロジック側のフレームワークとかみ合うようにしないと。どっちがより優位なんだろう?)
はっきり言って難しそうだからまた滞るんだろうなぁ・・・
部品作成中
コメントはまだありません。