開発日誌>2008年6月

開発日誌: 2008年6月


2008/06/29 (日) - myun2

前回の日誌より丁度およそ一ヶ月ですね。
お久しぶりです。ミューです。

ここんとこ、地道な作業が続いております・・・。表の成果として上がってこない、バックグラウンドな地道な作業・・・。

この土日は HitTest を実装しておりました。HitTest と言うのは──当たり判定。
どこのなんの当たり判定かと言いますとね。Sceneの画像オブジェクト編集画面で使うんですわ。

挿入した画像を、例えば Excel のシェイプオブジェクト移動みたいに出来たら良いじゃないですか。 良いじゃないですか、と言うより、思わずやってしまうんですよね・・・出来ないんですけど・・・。

あと、右クリックメニューより、その画像オブジェクトのプロパティ開いたり、切り取りとか、コピーとか、出来たら良いじゃないですか。
そう言う事で実装にトライしていたわけです。

 
・・・実際にはかなり難しくてですね・・・。

なんでか、って言うと、まず画像を回転出来るのですよ・・・。 だから単純な矩形チェックでは出来ない。SinとかCosとか、三角関数使ったりしないと・・・。 更にはカラーキー指定による透過情報、及び透過情報を含むファイル(DDSとかTGAとか)とかにも対応しているゆえ、 その透過部分がクリックされた場合には選択されたはならないよなぁ・・・と。

 
となるともう、画像のピクセルデータを取ってきて、そこが透過でない事をチェックしないとならない・・・。
しかし現状 Open-MGL にはその機能(ピクセルデータを取ってくる機能)は無くてですね。実装していた次第なのです・・・。

IDirect3DSurface::GetRect()を使うんですがね。こいつが非常に面倒でしてね・・・。
クラス化です。で、そのクラスがコメント空行含めて400ステップ程・・・。ロックちゃんと開放しないとデッドロックになるしな・・・トホホ・・・。

 
HitTest 自体は意外と簡単。矩形計算、三角関数アレコレは非常に面倒ですので、 いったん別のサーフェースへ実際の表示と同じ(位置、回転情報全て)ようにレンダリングし、テスト対称なピクセルのアルファ値が0以外であるかをチェック、というもの。 カラー値全てではなくアルファ値のみとしているのは、カラー情報があるもののアルファ値が0、と言うパターンもあるからです。 当然そういった場合、当たり判定としては当たってないことにしないとNGですからね。

 
・・・んで。よーし、できたぞー!と実装してみたものの、なんかイマイチちゃんと当たり判定されなかったりネ・・・(何

公開物として出来上がるのは、もーちっとだけ先なご様子・・・。