BulletMLによるシューティングゲームの構築

BulletMLを使ってシューティングゲームを構築すると、
こんな形に落ち着くのでは、というkenmoの実装例をメモ書き。
 

BulletML

BulletMLはどんなものか簡単に解説しますと、
XMLを解析して「弾幕」を生成するだけです。
 
なので弾を発射する「敵」の動きは別に作る必要があります。
そこでkenmoが考えたのが、

という役割分担です。
 
これにより、メインループとなるシーンクラスから、
敵クラスと弾クラスの分離を行おうと考えたわけです。
 
 
あと、BulletMLの仕組みについて押さえておきたいのが、
「Action」と「Bullet」というクラスから成っている、ということです。
この2つのクラスは互いに集約(参照)している、という関係を持っています。
 
そして、BulletMLのエントリポイントが「topAction(Action)」という奴です。
 
こいつを更新すると、Bulletクラスを生成します。
そして、その生成されたBulletクラスに更新をかけると、
集約しているActionクラスに基づいて移動したり、新しいBulletクラスが生成されたりする、
というのがBulletMLの仕組みです。

こんな感じに「入れ子」になっているのがBulletMLの特徴です。
 
 

kenmoのアーキテクチャ

で、kenmoのアーキテクチャ(そんな大層なものではないですが)はこんな感じです。

フローはだいたいこんな感じです。
 
まずは敵の生成からです。
①メインシーンは、「敵スクリプトクラス」を実行します。
②敵の生成命令があれば、「敵スクリプトクラス」は敵の生成を「敵リスト管理クラス」に依頼します。
③生成された「敵クラス」は、使いたい弾幕パターンのtopActionを「BulletML管理クラス」から取得します。
 
つづいて、敵の更新をします。
④メインシーンは「敵リスト管理クラス」に保持している「敵クラス」全ての更新を依頼します。
⑤「敵クラス」はtopActionを更新します。そのとき「弾クラス」の生成があれば生成を行い、
それを「弾リスト管理クラス」に登録します。
 
最後に、弾の更新です。
⑥メインシーンは「弾クラス」の更新を行います。「弾クラス」が「弾クラス」を生成することがあれば、
それを「弾リスト管理クラス」に登録します。
 
 
あと、狙い撃ち弾を行うために必要な「プレイヤーの座標情報」が抜けていますが、
それについては、更新処理呼び出しにポインタを渡すようにしています。
書いていて気がついたのですが、引数渡しよりも基底クラスのスタティックメンバに持たせたほうがいいですねー。
 
あと、当たり判定はメインシーンクラスでやってます。
 
 
 
以上が、kenmoの実装例でしたー。