2011年1月21日金曜日

2Dシューティングの影表示

夜の自由時間になると、やはりなぜか眠くなってしまう毎日ですが、うとうとしながら少しずつゲーム作成しています。

今回は2Dシューティングを進めました。地上物関連の追加して、破壊後に破壊痕を残せるように更新しました。また空中物には、影表示を追加しました。(画像はhamcorossam様よりお借りしております。)

通常、2Dの影などで悩むことなど無いかもしれませんが、今回2Dの影で問題になったことについて書いておきたいと思います。

UROBOROSXNA_20101221_2

2Dシューティングゲームの影表示

2Dの影表示で悩むとは思ってなかったのですが、場面によっては、2Dでも影表示がちょっとやっかいなことが分かりました。上の画像のように、背景が多重スクロールする場合、影は前方背景にのみに影を表示し、後方背景(青色の部分)には影を表示したくない場合などがあるのでした。

2D機能だけをつかって、うまく前方背景のみに影をマスクして表示するって結構難しくないでしょうか?上画像では、たまたま影を縦割りにして左側だけを表示すればよさそうですが、スプライトなので、どんな状態で前方背景と後方背景が重なっているかは保証できないですよね?

そう思って他のシューティングの動きを観察してみると、やはり同じようなことで悩まれていたんだなと実感する影の挙動になっているものが多かったです。

一般的な影付き2Dシューティングゲームの動きをよくよく観察すると、影が前方背景の一部に乗っているときには影を全部表示し、乗っていないときには影そのものを非表示という処理をしているものがおおく、影が突然出現したり消えたりを繰り返しています。これはスプライトを使う上で最も納得いく軽くて現実的な対処方法だと私も思います。


ステンシルバッファを使ってみる

背景スクロール速度などを考えると、上記と同じ対処方法でもよかったのですが、地上物の破壊痕も、ドット単位に自由な位置に表示したいこともあったので、ステンシルバッファを使用して前方背景でマスキングして影や破壊痕を表示する方法を思いつきました。

(破壊痕も表示位置に気を付けないと、宇宙空間に地上物の破壊痕が浮かんでしまうというわけです。)

UROBOROSXNA_20101221_1

ステンシルバッファを使用して、前方背景をマスク対象にすることで、綺麗に影や破壊痕が前方背景のみにマスキングされて表示できるようになりました。

ステンシルバッファは、今回使うのが初めてだったのですが、10行ほどプログラムを追加するだけで、そうぞう以上に簡単に使用できました。今回の件でステンシルバッファの使い方も無事理解できたので、今後3Dシューティング側のエフェクトなどにも応用していきたいと思っています。

これを実装した後に、もう一つ方法を考えました。その方法は、ステンシルバッファを使わずに、前方背景と同じ速度でスクロールする破壊痕表示などをする背景を用意して、そこに葉開梱を表示するというものです。この方法ではドット単位で任意の位置に破壊痕は置くことはできないですが、運用上はほとんど問題はないと思います。

破壊痕をドット単位指定で配置することなどあるのか?ということなのですが、今考えているのは、ボスや中ボスを破壊した後、地面に落として、落とした位置に大きめの破壊痕をドット単位に、任意の位置に置けたらいいなということからの発想です。実際そういう処理を入れるかは分かりません。


余談ですが、2DシューティングゲームにステンシルバッファやZバッファを使うのは許されるのでしょうか。XBOXでは問題ないとして、見た目が完全に2DなWindows版シューティングが、3D機能を必要とするとなると、なんだこのゲーム僕のコンピュータでは、動きが遅くて遊べないよ、などと言われそうな気もします。

一応目標としては、XBOX/Windows/Silverlightで動かすことを考えていますが、ハードウェア機能を使う重そうな機能は、オンオフできたり、XBOXだけに限定したりしたほうがよいのかもしれないですね。そのあたりも、どうするべきか探ってみたいと思います。

0 件のコメント:

コメントを投稿