ステージキューの管理について
まだDotsと関係ないところの話です。
ここで作っているのはシューティングゲームなので、ステージは時間と共にスクロールしていき、
一定の地点に来ると敵が出てきたり背景が変わったりするわけですが、
それを表現するデータ構造としてどういう方法がいいのかいろいろ検討した結果、
結局全部同じ構造のデータとしてまとめればいいんじゃねということになり、下記のような形になりました。
これをステージキューと呼んでいます。
ここで言うtypeというカラムが、それがどういう種類のイベントなのかを指定しているものです。pathで何か使いたい文字列のパラメータを、param1〜5で何か使いたい数値のパラメータを設定しておきます。
例えばtypeがSpawnの場合、敵の出現を表すイベントになります。
このゲームでは、基本的にフレームが進行するごとにカウンタを加算していき、
カウンタの値がqueue_idの値と一致したら、そのイベントを実行するというような形式でステージを進行させていきます。Spawnを例にとると、イベントが実行される際に、param1〜5の値を下記のような形でマッピングしなおした敵スポーンを表現する構造体に変換して利用します。
publicstructQSpawn{publicintentryId;publicintenemyId;publicintverseId;publicintx;publicinty;}敵スポーンの場合、DB上でparam4に出現時X座標を、param5にY座標を書いておき、それがQSpawnのxとyに割り当てられるようにしています。
敵スポーンに関しては今のところ文字列パラメータは必要なく、
極力可変長データは持たせないようにしたいため、pathのデータは捨てます。
Q:無駄なデータ領域が多すぎでは?
A:はい
でもどうやったって最終的には複雑になるんだからこの程度の取り決めだけしておけばよくない?ということになり、現在の形になりました。
現在のところステージキューのイベントには下記のような種類があります。
- タイルマップ背景の切り替え
- パーティクル背景の切り替え
- 敵のスポーン
- 敵の武装契機(攻撃情報の設定)
- 敵の移動契機(直線移動、円形移動、バネ等の挙動タイプごとに移動)
- BGMの切り替え
- バース(独自機能)の切り替え、名前の設定
シューティングゲームの作成にあたってはけっこう当たり前に使われているやり方なのかもしれませんが、
いざ自分で作ろうと思って検索してみても意外と情報が見つからなかったので、一例として記載しておきます。
