× [PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。 |
3D図形を扱うクラス。
どの図形でもできるだけ内部表現を同じにしてみたくて、 マトリクスで表すようにしてみた。 ◎概要◎ どの図形も、基本形を決めておく。 例えば球なら、原点中心、半径1の球。 例えば円柱なら、原点中心、半径1、高さが2でZ方向に立っている円柱。(Z=1が天板、Z=-1が底面) で、形を変えるときは、マトリクスを拡大縮小する。 球なら、スケール値がそのまま半径になる。xyzで別々のスケールを掛ければ楕円球になる。 円柱なら、xyが底面の形を変え、zスケールが高さを変えることになる。 多くの図形はこれで事足りる。 移動や回転ももちろんマトリクスで普段通りやれば済む。 PR |
fdFigureを充実しようとしたらマトリクスが必要になったので、
fdMatrixを作っていたら4次元ベクトルが必要になったので、 fdVector4構造体を作っていた。 |
fdという名前で作り始めた。
なぜfdか。 キーボードのホームポジションだから打ち始めやすいから。 この2日で作ったのは fdType.h 基本型定義 fdMath.h 数学定数など fdVector.h 2次元ベクトル、3次元ベクトル fdFigure.h 3次元図形 fdFigureについてはちょっと語るところがあるので、後日別エントリで。 |
テクスチャ描画する関数の決定版(?)。
汎用的にするのが目標。 機能は多彩。でも使い方は簡単。そういう風に、私はなりたい。 というわけで、 関数としては1つだけ。 void drawTexture(SpriteData data); これ以上ないくらい単純明快。 では解説していきます。 drawTextureができること(いずれ他にも出てくるかも) ・テクスチャを指定できる ・描画する座標を指定できる ・描画サイズを指定できる ・アンカーポイントを指定できる ・回転して描画できる ・uv座標の切り取りができる ・減色ができる これらのことを全部やるには、指定すべき変数がかなり多くなります。 それをぜんぶ関数の引数に持たせるのは冗長。 オーバーロードするにも組み合わせが多いし、デフォルト引数で対応するのも難しい。 という訳で、引数としては構造体を一つ渡すだけにしました。 この構造体にすべての変数が入っています。
|
CGRectのような、 x,y,w,h を保持する矩形構造体は、
矩形が座標系に直交していることを前提としている。 だから、ナナメに置いてある長方形や他の矩形を表すことができない。 テクスチャをナナメに描画したい場合もあるので、それは x,y,w,h,angle と傾け角度も含めて表すか、 (あるいはpos, anchorPoint, angle で座標とアンカー点と傾け角度で渡す) point1,point2,point3,point4 で4点を直接持つ矩形構造体にするかが必要だ。 テクスチャ描画目的なら、矩形であることはたぶん前提なので、1番目で良さそうだ。 ゲームロジックに使う汎用四角形で3番目を使えば良さそう。 ※矩形=長方形 |
何らかの変数の中身を出力するデバッグコードがあるとする。
Objective-Cでいうと、NSObject の description()関数のような。 毎フレーム出していると、他の出力が流れてしまうため、特定のタイミングでだけ出したい、ということが良くある。 そういうことがすぐできるマクロを用意した。
一回だけ実行したいときはこっち。
使用例はこうなる。
応用して、ヒットカウントが特定の回数のときだけ実行とか、 ある変数を監視しておいて、特定の値のときだけ実行とかが考えられる。 当然、リリースビルドのときにはデバッグコードが消えるようにしておきたいのだが、 その方法がまだ思いつかない。 |
点と閉じた図形がある。
点が閉じた図形の内部にあるかどうかを判定する関数、 閉じた関数を長方形とすると、 RectContainsPoint(Rect rect, Point point); となるが、これの判定は point.x >= rect.x1 && point.x < rect.x2 && point.y >= rect.y1 && point.y < rect.y2; となる。 不等号にイコールの付く・付かないは、上記のように >= x1(y1) < x2(y2) とする。 大きさのない図形(長方形ならx1=y1=x2=y2=0など)を渡したとき、内部にはいかなる点も含まないとするため。 例えば未初期化図形rectZero(x1=y1=x2=y2=0)と未初期化点pointZero(x=y=0)があるとき、これらをRectContainsPoint()に渡して真が返ってきてしまうと、期待と反するからだ。 |