おきブログ XNAにおける3Dゲーム描画設計 (スプライト描画情報を持たせる)
3Dゲームにてスプライトの表現というと、奥行がないもの(常に手前に表示されるもの)ということで、ステータス情報や文字情報が主な表示情報となることが多いと思われます。ここでは従来のサンプルにコードを追記編集して、自機のエネルギーメーターの表示といったサンプルを挙げて説明して行こうと思います。
■サンプルソース (2008.03.23.zip)
◇ ◇ ◇
リロードゲームをダウンロードする方法
モデルキャラクタータスククラスを設計した際は、このクラス内にモデル情報を保持しましたが、今回はスプライト情報を持つクラスとして、スプライトキャラクタータスククラスを設計します(至極単純な発想ですね)。
サンプルソース上では「SpriteCharacterTask.cs」がその実装例として実装しています。
XNA上でスプライトを実現するには、Texture2Dクラスを用いれば容易に実現が行え、この情報に対して描画を行えば、画面にスプライト(ビットマップ)が描画できます。モデルキャラクタータスククラスの時同様、スプライトキャラクタータスククラスには、このTexture2Dクラスをメンバ(m_texture)として保持し、このスプライトを描画するための座標 (m_drawRect)を内包しています。
ここで、スプライトとテクスチャーの用語が混合しているので、本ブログではどのように考えているかというと、
11 10 PCの勝利を再生する方法
[スプライト]
昔ながらの2Dゲームにて表現される、平面のビットマップオブジェクト(物体としての定義が強いです)。
[テクスチャー]
3Dのモデルに貼り付けるビットマップデータ(要素としての定義が強いです)。
という感じで表現します。
XNA上のスプライト情報はTexture2Dというクラスの考え方を持っていても、描画の際にはSpriteBatchというクラスを用いた「スプライト」という用語を用います。
CSにマップを追加する方法
3Dモデル表示をメインとしたゲームを作成する場合、(設計次第ではありますが)スプライトの情報というのは、基本的にステータス情報の表示等が主で、ゲーム上の自機や弾等の衝突が行われるようなオブジェクトとしては実装されません。これは基本的にスプライトには奥行情報が無いためで、3次元キャラクターと2次元キャラクターでは同じ次元で存在させて衝突させることが、困難とされているためです。
(これを実現した場合、大抵3次元座標の方が2次元座標の情報に合せる表現が多々見受けられます。例としては3Dの表現をしている2Dタイプのシューティングゲームなどがその例となっています)
本サンプルの設計では、2Dはあくまでステータス情報� �みという考えで設計しています。
次回からはこれを踏まえて、描画の設計について説明して行きたいと思います。
◇ ◇ ◇
ちなみに上述の例の逆応用で、2次元ビットマップを3次元空間で表現する方法があり、これは「ビルボード」と呼ばれる手法となります。古くからはFPSでDOOMが、RPGではゼノギアス等がこのような処理を行っているように見受けられます。ポリゴン描画のオーベーヘッドに比べ、高速で処理できますし、アニメ調のキャラクターを表現するゲーム設計には有効な手法と思います。
0 コメント:
コメントを投稿