やることがない→

やることがない→せいれんせんをやる→やることがない→ひそうてんそくをやる→やることがない→仕方ないのでDirectXのラッパーを書く→以下ループ
さすがのニート!!!


スプライトの実装でございます。ID3DXSpriteとか使うとスミスくんになんか言われそうなので四角形のポリゴン*1にテクスチャ*2を貼ってみるよ!実際ID3DXSpriteは行列変換がなんとなく怪しかったりするしね。ただの面1枚表示するだけと考えるとばかみたいに面倒だけどまあそんなもんだと分かってればどうってことはない。ローカル座標で大きさ1x1の正方形を作成→ワールド座標への変換時に拡大して任意の大きさに、ついでに回転とかも→カメラ変換はスルー(単位行列)→射影行列は正射影行列で(マルペケさんのアイデアより)。とりあえずマルペケさんのをまねした感じなので画面の中心が原点になってますがまあどうとでもなるでしょう。ワールド変換時に拡大して使うので、すべての画像の描画で元の1x1のポリゴンはそのまま流用でき、メモリロック・書き込み・アンロックをしなくて済みます(ワールド行列とテクスチャを変更するだけ)。……まあこれでやったと思ったんだけど、テクスチャのサイズは2の累乗でないといけない縛り*3があって、UV座標*4を変えたい気がしてきた。


何も表示されない→少し書き加える→何も表示されない→もう少し書き加える→何も表示されない→少し不安になってくる→カリング*5をオフにしてみる→白い長方形が表示される
ま、どうせそんなことだろうと思ったけどね。座標とか回る方向とかイメージしてゴタゴタ考えるよりも片方でやってだめなら反対にしろ理論が一番。2番目と3番目の頂点の座標をひっくり返して再度カリングをオンにして終了。


まあ高1で行列はおろかベクトルも習ってないのにビルボード*6を実装しただけありますよね。確かカメラ行列の中から回転行列の成分だけ抜き出して逆行列をワールド行列にかけたんだっけか・・・。忘れた。まああれも方法はいろいろあるけどね。爆発アニメーションとかUV座標書き換えてますよね。


まあ今考えたこととしては、UV座標を変えずにできそうだね。オリジナルの画像サイズがあれば中心点(w/2, h/2)が分かり、2の累乗に切り上げられた後の中心点もわかる。あとは各種座標変換の前後でゲタをはかせる的に平行移動行列をかけるんだろうね。…ただのID3DXSpriteじゃね?広がった部分はアルファブレンドで透過ですねわかります。640x480のタイトル画像がゴミで32x32のドット絵の集合が神に見えてきた。…ドット絵の集合とかUV座標の書き換えがいるじゃねーか。そういや非想天則のドット絵は全て1モーション1ファイルだったな…。


「マルペケつくろーどっとコム」さんのDirectX9編を参考にしまくってます。Thanks.


なんだかんだいっても現在2Dゲームを作るならこれくらいでいいんじゃないかって程度の知識ですよ。むしろ、DirectX10だとシェーダ*7必須とか言ってるし…。

*1:まあ厳密にいえば三角形2枚だけど

*2:画像

*3:半ば常識と化しているらしい 調べたら私のグラボもそうだったし

*4:ポリゴンの頂点が持つテクスチャ上の座標

*5:面には方向があって(右ねじの法則っぽいの)、速度のため裏面は描画しない仕組み。スマブラでポーズしてカメラを動かすと床が透ける系のアレ。

*6:常にカメラの方を向く板ポリゴン

*7:無理に言えばGPU(グラボのCPUっぽいもの)用のプログラム …いいのかこんな言い方で