ページ 11

3次元の空間の作成方法について

Posted: 2008年10月25日(土) 07:14
by 山崎
再度お世話になります、山崎と申します。
この度は、皆様の意見をお伺いに参りました。

現在、3次元の空間を用いたアクションゲームを作っております。
しかしまだDirectXやポリゴンといった技術が私に無いので、
DXライブラリを用いて「3次元に見える」空間を表現しようと思ってます。

例を挙げるとすれば、ちょっと古いですが
スーパーマリオRPGのフィールドのような空間を表現したいと思ってます。
横幅、縦幅、高さがあって、主人公の前に壁があればもちろん主人公はその後ろに隠れて見えません。
ただ、あのくらいのグラフィックの見栄えは真似できませんが・・・。

そこで皆様の意見をお伺いしたいのが、
どうやってこの3次元の空間を表現するか、ということなのです。
どのようなデータ構造を用いるか、と言った方がいいかもしれません。
「こういう構造にするのが定石だ」「一般的にはこうだ」
「飽くまで自分ならこうする」「こういう方法はどうか」
といった案があれば、どうか教えて頂きたいと思います。

私はchar型の3次元配列を用いて、空間を小さな立方体の集まりとして表現しようと考えました。
たとえば、3次元空間の情報としてchar field[100][110][120]と宣言し、
'b'がブロックの意味であるとし、field[3][4][5]='b'だとしたら、
この空間は横幅が100マス、縦幅が110マス、高さが120マス分あり、
X=3,Y=4,Z=5に位置する場所にはブロックがある、という感じです。
この方法は有効なのでしょうか?

また、3次元の空間に限らず、皆様はアクションゲームでもRPGでも、
キャラが動き回るマップをどのようにして作っているのでしょうか。
マップデータが記入されたファイルを前もって作り、それを読み込む、といった手法でしょうか。
広いマップになると手打ちでマップを記入するのも大変だと思うのですが、
皆様はどうしているのでしょうか。

3つも質問があって誠に申し訳ないのですが、
皆様の意見が聞ければ幸いです。

Re:3次元の空間の作成方法について

Posted: 2008年10月25日(土) 14:23
by 御津凪
> スーパーマリオRPGのフィールドのような空間を表現したいと思ってます。
あれは、セミ3D、いわゆるクォータービューと呼ばれるものですね。

3次元配列を持てば、簡単に3次元プロック座標をもてますが、
1ブロック単位のサイズが1バイトだった場合、

100 * 110 * 120 = 1320000(約1.25MB)

と配列の容量が大きくなり、
余り広大なマップを用意すると、メモリ領域を圧迫してしまいます。
(現在のPC環境では問題ないかもしれませんが)

私の考えた構造では、
typedef struct SCellData{
	char			mHeight;	// 高度(-128~127)
	unsigned char		mTip;		// チップ番号(0~255)
	unsigned short		mAttr;		// ブロックの属性フラグ(16bit)
	struct SCellData*	mNext;		// このブロックに一番近い次の上のブロック情報
} SCellData;
を、2次元配列(横と奥行き)として用意して、
壁や空中に浮いているブロック(高さ)は、 mNext にデータを追加するといった形で表現します。

この3次元タイプのマップを手作業で作成するのは、
まず無理でしょう。
この場合、自分でマップ作成を行うツールを用意する必要がありますね。
(二次元マップでは、汎用マップ作成ツールが配布されたりしていますが、3次元タイプ用はみたことが無いです)

あと、先日、管理人さんが開館したサンプルプログラミングの館に、
いくつかのマップ構造を表現したサンプルがあるので、
そちらも参考に見てみてはいかがでしょうか。

それとは別に参考になるようなものを一つ。
http://www.biwako.ne.jp/~hiroharu/queek.html
Queek
これはクオータービューのゲームを作成できるツールです。
これのマップ作成ツールの部分がツール製作の参考になると思います。

Re:3次元の空間の作成方法について

Posted: 2008年10月25日(土) 19:44
by 山崎
御津凪さん

ご返信、誠にありがとうございます!
先日に続き再度いろいろお教えいただき、感謝の言葉もございません。

なかなかコーディングするのが大変ですぐに試すことができず申し訳ないのですが、
ぜひとも参考にさせて頂きたいと思います。

また、便利なツールを教えしていただき本当にありがとうございます!
早速ダウンロードして試してみようと思います。

サンプルコードまで例示してもらって、いつも親切で本当に助かります。
ありがとうございました。