さて今回は、アクションゲームなどで体力ゲージが表示されている、
「ステータスパネル(とでもいうのかな?)」に凝ってみることにしました。
あまりにも拙作ゲームのパネルがへっぽこだったので(^^;) えーと、よく見る「ゲージ」っていうのは、大抵縦か横にまっすぐ増えていく、 っていうのが多いですよね。しかーし!!な〜んかこれだと簡単過ぎて つまんないんじゃない?と思う方もいるはず(もしかして俺だけ?)。確かに、 一番直感的で分かり易いんだと思うけどね。 で、いろいろ考えた結果、「ゲージは円形」ということになりました。 左の図を見てみれば分かると思いますが、なんちゅーか、昔のレースゲームで よく見かけるようなやつです。でも、結構これを作るとなればむっかしーんです。 んじゃ、何が難しいのか。それは「ゲージの増え方」ですよ。 縦、横にまっすぐ伸びるやつだと、ゲージが淡色で塗りつぶされているものであれ、 画像を使っているものであれ、かなり簡単に処理できます。だって、 転送する範囲は「矩形」なんですから。 しかし、円形ゲージでは転送範囲が「矩形」ではなく「扇形」ですよね。 これがむっかしーんですよ。扇形で転送できる関数とかはないので、このへんを 自前で処理する必要があるのです。しかし、これをなんとかしてこそプログラマというもの。
ちゅうわけで、いろいろと方法を考えてみるわけです。
しかし、上記の方法ではゲージに画像を使うことができないし、
どうもしっくりこないので、他の方法を考えることにしました。
で、どうするかというと、画像変形のひとつである「極座標変換」を使うのです。
具体的には、矩形範囲の転送を使って画像をずらしたり、指定色で塗りつぶしてから、
極座標変換を適用することによって、みごと「扇形」転送処理を施したかのように
見せることが出来ます。
さて、だいたいイメージはつかんでもらえたと思います(つーかツカンドケ!!)。
では早速詳しくいってみましょう。 実は、極座標変換の高速化のために作っている「極座標テーブル」を作っているところを ちょこっと変更してやるだけで、いいんです。用は、転送元のサイズをうま〜く転送先にあわせる、 そんだけです。 {R・・・半径、kTable・・・極座標テーブル、tex・・・テクスチャ、} p:=@kTable; for y:= 0 to R*2-1 do begin for x:= 0 to R-1 do begin //中心座標による変換 tx:=x-R; ty:=R-y; //直交→極 dx:=trunc(Atan2(tx,ty) * tex.Width / 1024); dy:=trunc(sqrt(tx*tx+ty*ty)*(tex.Height/24)); //テーブルに入れる p^:=Point(dx,dy); //次へ Inc(p); end; end;こんな感じになるだけです。 変更したのは赤い部分です。あ、Atan2で例外処理をしていないことと、 この場合、角度は360°系(2π)ではなく、1024度系ってことに注意してね。 それと、テーブルのサイズが24×48ですが、これは半円のゲージを作るためです。 このゲージをスクロールさせると、「ゲージが増える(減る)」っていう処理になります。
|
※ゲージ なんつーか、こんなやつ。 ![]()
※円形
※矩形
※「扇形」で転送できる関数はない
※これをなんとかしてこそプログラマ。
※FloodFill
※極座標変換
|