縦スクロールシューティング23

敵に弾を撃たせるアルゴリズム

シューティングは出現させた敵が自機に向かって攻撃をしてくるのですが、その攻撃アルゴリズムの付け方はMMF2でどうやるのかを考えます。

一番簡単なのは変数をタイマー代わりに使って時間が来たら自機に向かって一直線の弾を撃たせます。これ以外の方法も(簡単に実装可能かどうかはともかく)考えてみましょう。 

  • 指定したタイミングで弾を撃ってくる
  • 感知型レーダーで感知したら弾を撃ってくる
  • 2点間距離を計り特定距離に達したら弾を撃ってくる

変数を使いタイマー代わりに使うことで指定したタイミングで敵に弾を撃たせます。

感知型レーダーというとなんかカッコイぃですが、MMF2的にはレーダーを模したスプライトを用意してこれを対象スプライトを中心軸として回転させます。レーダーというより衝突検知用デテクタの一種。高速ループを使うので作るのは少々面倒くさいです。実際の作り方は高速ループ番外編で扱います。それから、動いてる的に当てるためには偏差射撃の計算が必要に。今回はそのロジックを省いてあるので移動する的の方向によっては弾を外しまくっているのが確認できます。

2点間距離の測り方は複数アプローチがありますけど、MMF2はエクステンションの「Advanced Direction」を利用すると簡単に取得できます。この時、当然必要となるのは敵A(X位置、Y位置)そして自機(X位置、Y位置)、この四つの値。当たり前ですが三角関数を使って自分で計算もできます。

Advanced Direction、Direction Calculator

Advanced Direction、Direction Calculator

※下のサンプルはマウスとキーボード操作で座標を動かせます

先に紹介したレーダー型も基本的には二点間距離を測っているのと同義です。距離を計算する手間をスプライトとスプライトの衝突検知に置き換えただけなので考え方は大差無いとも言えます。しかしレーダー型はちょっと改造すれば例えばサーチライト型(スプライトの進行方向にデテクタを配置する)にすることもできるし、とにかく計算が苦手な人はまずスプライトを用いたレーダー型で作ってみればだいたい動くだろうからこの方法をお勧めしてみます。

ちなみにオブジェクトの回転はMMF2のHWA機能を使わないと重い処理になりがちなので、実際にスプライトを回転させないで、これを回転するアニメーションでごまかすと処理を軽くできます。