忍者ブログ
  • 2024.03
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 2024.05
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

【2024/04/19 22:16 】 |
fdFigure3D
3D図形を扱うクラス。

どの図形でもできるだけ内部表現を同じにしてみたくて、
マトリクスで表すようにしてみた。


◎概要◎
どの図形も、基本形を決めておく。
 例えば球なら、原点中心、半径1の球。
 例えば円柱なら、原点中心、半径1、高さが2でZ方向に立っている円柱。(Z=1が天板、Z=-1が底面)
で、形を変えるときは、マトリクスを拡大縮小する。
 球なら、スケール値がそのまま半径になる。xyzで別々のスケールを掛ければ楕円球になる。
 円柱なら、xyが底面の形を変え、zスケールが高さを変えることになる。
多くの図形はこれで事足りる。
移動や回転ももちろんマトリクスで普段通りやれば済む。

PR
【2011/06/28 02:07 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
fdVector4
fdFigureを充実しようとしたらマトリクスが必要になったので、
fdMatrixを作っていたら4次元ベクトルが必要になったので、
fdVector4構造体を作っていた。
【2011/06/25 14:43 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
fdライブラリ作成
fdという名前で作り始めた。
なぜfdか。
キーボードのホームポジションだから打ち始めやすいから。

この2日で作ったのは

fdType.h
基本型定義
fdMath.h
数学定数など
fdVector.h
2次元ベクトル、3次元ベクトル
fdFigure.h
3次元図形

fdFigureについてはちょっと語るところがあるので、後日別エントリで。

【2011/06/23 09:10 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
OpenGLESを使ったゲームの作成までの流れ
XCodeで

まず、新規プロジェクトの作成。
OpenGLES使用したプロジェクトを選択。



いったんビルド。
グラデーションのかかった四角形が上下に揺れる。




ついで、コードの書き換え。

最初からあるファイルの拡張子を.mから.mmに変更。

また、既存のプロジェクトからソースをコピー。
***AppDelegate.h/mm
***ViewController.h/mm
の4ファイル。
(main.mm, EAGLView.h/mm は不要)

ビルドエラーが起きるので、不要なインクルードは削除。
また、必要なファイルがいくつか必要になるのでコピー。
debug.h/mm
common.h/mm
ios_interface.h/mm
GLDraw.h/mm
GameMain.h/mm

さらに、シェーダも書き換える。
Shader.vsh
Shader.fsh

そして忘れがちなところで、
coregraphics.frameworkを追加する。


この状態でビルド。


すると、ファイル読み込みに失敗して終了する。


読み込みが必須である、
white.jpg
earth.jpg
をプロジェクトに追加。


この状態でふたたび実行。

すると、画面が(0.5,0.5,1.0)一色に表示される。
これで完成!




コードをコピーしないで、プロジェクト生成時に自動でできるようにしたい。
また、切り分けがちゃんとできるよう、ファイルを芋づる式にコピーする必要がないようにしたい。

例えば、
デバッグ出力などは、
DEBUG_PRINTF()
を使うと、debug.hをインクルードする必要がでてしまうので
#if DEBUG
NSLog();
#endif
とするとか。
数は多くないし、そんなに読みづらくはならないだろう。

io_iosがInput.hを見ているが、これは逆にすべき

【2011/05/14 03:38 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
テクスチャ描画関数
テクスチャ描画する関数の決定版(?)。

汎用的にするのが目標。
機能は多彩。でも使い方は簡単。そういう風に、私はなりたい。


というわけで、
関数としては1つだけ。

void drawTexture(SpriteData data);

これ以上ないくらい単純明快。


では解説していきます。

drawTextureができること(いずれ他にも出てくるかも)
・テクスチャを指定できる
・描画する座標を指定できる
・描画サイズを指定できる
・アンカーポイントを指定できる
・回転して描画できる
・uv座標の切り取りができる
・減色ができる


これらのことを全部やるには、指定すべき変数がかなり多くなります。
それをぜんぶ関数の引数に持たせるのは冗長。
オーバーロードするにも組み合わせが多いし、デフォルト引数で対応するのも難しい。
という訳で、引数としては構造体を一つ渡すだけにしました。
この構造体にすべての変数が入っています。


struct SpriteData {
public:
TextureHandle_t hTex; //テクスチャハンドル
point_t pos; //描画座標
size_t size; //描画サイズ
point_t anchorPos; //テクスチャ座標のどこを描画座標に置くか(0.0~1.0)
float rad; //回転させる. 回転中心はテクスチャ中心。anchorPosではない
rect_t uvRect; //テクスチャの切り取りUV座標
color_t color; //減色

SpriteData(TextureHandle_t ihTex)
: hTex(ihTex), pos(0.f, 0.f), size(0.f,0.f), anchorPos(0.f, 0.f), rad(0.f)
, uvRect(0.f, 0.f, 1.f, 1.f)
{}
SpriteData& Tex(TextureHandle_t ihTex){this->hTex = ihTex; setOriginalSize(); return *this;}
SpriteData& Pos(aoPoint2 pos){this->pos = pos; return *this;}
SpriteData& Pos(float x, float y){return Pos(aoPoint2(x,y));}
SpriteData& Size(size_t size){this->size = size; return *this;}
SpriteData& Size(float w, float h){return Size(aoSize2(w,h));}
SpriteData& Anchor(point_t pos){this->anchorPos = pos; return *this;}
SpriteData& Anchor(float x, float y){return Anchor(aoPoint2(x,y));}
SpriteData& Rect(rect_t rect){this->pos = rect.LT(); this->anchorPos = point_t(0.f,0.f); this->size = rect.Size(); return *this;}
SpriteData& AngleRad(float rad){this->rad = rad; return *this;}
SpriteData& AngleDeg(float deg){this->rad = deg / 180.f * 3.14159265359f; return *this;}
SpriteData& UVRect(rect_t rect){this->uvRect = rect; return *this;}
SpriteData& Color(color_t col){this->color = col; return *this;}
SpriteData& Color(float r, float g, float b, float a = 1.f){return Color(color_t(r,g,b,a));}
};

【2011/03/20 00:43 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
Inputクラス・実装第2版
Inputクラスの実装。の第2版。
旧版はこちら

現状対応しているのは、大きさのあるボタンだけ。=つまりタッチスクリーン。

【2011/03/19 23:52 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
矩形構造体と描画
CGRectのような、 x,y,w,h を保持する矩形構造体は、
矩形が座標系に直交していることを前提としている。
だから、ナナメに置いてある長方形や他の矩形を表すことができない。

テクスチャをナナメに描画したい場合もあるので、それは
x,y,w,h,angle と傾け角度も含めて表すか、
(あるいはpos, anchorPoint, angle で座標とアンカー点と傾け角度で渡す)
point1,point2,point3,point4 で4点を直接持つ矩形構造体にするかが必要だ。

テクスチャ描画目的なら、矩形であることはたぶん前提なので、1番目で良さそうだ。
ゲームロジックに使う汎用四角形で3番目を使えば良さそう。

※矩形=長方形

【2011/02/13 13:31 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
Inputクラス・実装
第2版を参照のこと


Inputクラスの実装。

現状対応しているのは、大きさのあるボタンだけ。=つまりタッチスクリーン。

【2011/01/29 15:48 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
デバッグコードの実行時有効化に便利なマクロ
何らかの変数の中身を出力するデバッグコードがあるとする。
Objective-Cでいうと、NSObject の description()関数のような。
毎フレーム出していると、他の出力が流れてしまうため、特定のタイミングでだけ出したい、ということが良くある。

そういうことがすぐできるマクロを用意した。


#define DEBUG_EVERYTIME_BEGIN(b) \
do { \
static bool b = 0; \
if (b) {

#define DEBUG_EVERYTIME_END() \
}\
} while(0)


一回だけ実行したいときはこっち。

#define DEBUG_ONETIME_BEGIN(b) \
do { \
static bool b = 0; \
if (b) {

#define DEBUG_ONETIME_END() \
}\
b = 0; \
} while(0)



使用例はこうなる。

DEBUG_ONETIME_BEGIN(b);
doSomeDebug();
DEBUG_ONETIME_END();



応用して、ヒットカウントが特定の回数のときだけ実行とか、
ある変数を監視しておいて、特定の値のときだけ実行とかが考えられる。

当然、リリースビルドのときにはデバッグコードが消えるようにしておきたいのだが、
その方法がまだ思いつかない。
【2011/01/29 14:53 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
図形
点と閉じた図形がある。

点が閉じた図形の内部にあるかどうかを判定する関数、
閉じた関数を長方形とすると、
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()に渡して真が返ってきてしまうと、期待と反するからだ。

【2011/01/10 02:16 】 | 自作エンジン | 有り難いご意見(0) | トラックバック()
| ホーム | 次ページ>>