2012年4月3日火曜日

STGにおける敵情報のデータ設計

シューティングゲーム(STG)の作り方を解説しているサイトは数あれど、敵のオブジェクト情報をどのように設計するかについて言及しているサイトは割と見かけないような気がするので、軽く解説しておきます。

そんなん、単純に構造体で管理だろJK

・・・かもしれませんが、この部分のデータ設計を予め如何に適切におこなっておくかで、ゲームの表現の幅が大分変わります。私はそのことを、SHOT01~SHOT03(3作品)の開発での失敗を経て実感しています。

まずは、実際に設計中のデータ(実物)を見た方がイメージが沸き易いかと思います。
なので、現在開発中のSHOT04で作成途中のデータ構造を例示します。

クラス構造としては、敵、オブジェクト、パーツの3種類。

E-Rで表記すると、

  • 敵:オブジェクト=1:n(最大8)
  • オブジェクト:パーツ=1:n(最大8)

という感じ。
つまり、1匹の敵は最大64パーツ(8^2)持てます。
数は今後、コロコロ変わっていくんでしょうけど。

実は、SHOT01の頃は単純な1個の構造体で敵を表現していました。
ただ、それだと当り判定が複数個所に分かれるような場合、処理が面倒になります。
そこで、SHOT02とSHOT03では、1つの敵を複数のオブジェクトで表現する感じにしました。
ただ、それでも処理が厄介な部分があったので、今回は、敵、オブジェクト、パーツの3層構造のスキーマを定義。(予定)

オブジェクトには、有するパーツ数+パーツ情報を定義します。
例えば、グラディウスの多節足の敵の場合、根っこの部分、胴体の部分(複数)、頭の部分みたいなパーツをグループ化したものが、ひとつのオブジェクトになります。

それなら、オブジェクトとパーツだけ(2層構造)で十分だ・・・と普通は考えます。
(だから、SHOT02とSHOT03はその形態にしました)

ただ、例えば多節足を2本持っていて、足単位でパーツ破壊できるような敵(足×2+本体)というものを作ろうとするとプログラムが複雑になってしまいます。だから、オブジェクトを更にグループ化した、クラス(Enemy)を追加・・・という訳です。これで、どんなものでも簡単な処理で表現できる筈。まだ、作ってないから確証は持てませんが。

ちなみに、クラスだとかスキーマだとか、オブジェクト指向の用語を使っていますが、プログラム言語はCのみです。私は、C++やJavaが大嫌いなんですが、オブジェクト指向の考え方自体は、重要だと思っています。(ついでに、iPod touch化するときにもに楽になる筈)

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...