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

強制スクロール関連

順番で言うとイベントグループ「bullet」の次は「control」なのですが、「control」については8方向移動で解説したイベントなど一式をコピペで張り付けて使っています。なのですでに完成した8方向については今回新しく語ることもないから省略します。その次の処理が「Force_Scroll」というイベントグループになります。

強制スクロールはプレイヤーの操作処理とは別にしました。流れるような背景処理を作るためには背景自体を動かす方法がすぐ思いつくのですが、背景は一度固定したら位置を動かせないから、背景ではなくてレイヤーや仮想画面の表示位置を調整して流れるような背景処理を作ります。考え方として背景は動かねーから、カメラとか視点を動かす感じで画面を作るって覚えてください。
常に実行で画面の中央に表示
今回は強制スクロール用に「ET」という名前のスプライトを用意してそれを決められたタイミングで動かすついでにこのスプライトのXY位置を参照させ、「常に画面の中央に表示」というイベントで仮想画面の方も同調させています。ぎくしゃくしたスクロールはたぶんお気に召さないかと思いますが、滑らかにすると移動量が大きくなるのでマップというか背景も仮想画面に合わせた大きいのを用意しないとすぐにマップ終端に到達してしまいます。サンプルでは省エネのために移動量を小さく、背景も小さくしました。 

今回作ったサンプルのコリジョン(衝突判定)は大きく分けて3つで処理してます。

  1. 強制スクロール(Force_Scroll)
  2. ユーザーコントロール(collision)
  3. 敵の動作コントロール(encount)

衝突判定を含む三つ

強制スクロールにもコリジョンを独自に割り振ってあるのは強制スクロールと同調するのが仮想画面の位置だけではなくプレイヤーのコントロールするデテクタにも適用されているからです。つまり流れるような背景処理と一緒にプレイヤーの位置も自動で同期してやらないと、プレイヤーが何も操作しない場合に強制スクロールの流れに乗れないでプレイヤーはあっというまに画面外へ取り残されてしまいます(ゲームとしてそういう仕様ならそれはそれで良いのですが)。
同期しない場合
同期する場合
実際の同期処理部分

実際の同期処理部分

そして強制スクロールの移動に同期させてスプライトの位置をイジっているから、ここにも独自の衝突判定処理を含ませないと画面終端にプレイヤーデテクタが位置する場合のコリジョン処理やその他諸々に不都合が出てきます。あと知っておいた方が良い前提知識として「赤文字のイベント」と「黒文字のイベント」は実行される順序というか優先度が異なるというのがあります。今回詳しくは書きませんが「赤文字のイベント」は優先順位が高いので他のコリジョン処理を赤文字で実行している場合=高速ループ処理してる部分が他にもある場合にはやはり「赤文字のイベント」で揃えて実行します。サンプルを実際に見てもらえば分かりますが強制スクロール用コリジョン判定で高速ループをたったの一回しか回してない理由は、コリジョン判定の優先度は高速ループを使った赤で統一しているからです。こうすればループが開始されたらコリジョン処理が即実効されるので間に他の処理が入り込む余地を確実に無くせます。

強制スクロールは背後から迫ってくる巨大な壁をイメージして作りました。だからサンプルにはプレイヤーの背後から迫る巨大な壁をスプライトとして実際に配置してあります。

プレイヤーの背後から迫り来る巨大な壁

プレイヤーの背後から迫り来る巨大な壁

しかし壁のサイズは実際にでかくする必要性が無いので・・というか実際に壁を配置する必要性すら本当は無いからサンプルではなるべく控えめなサイズにしてあります。だってコリジョンは本来Y位置の参照だけでいいから実際にスプライトと衝突させる必要なんてないの。しかし小さいとは言え、実際に壁を配置したのはサンプルとしてその方が分かりやすいかなーって配慮です。そしてこの程度のスプライトなら処理の重さには影響出ないってのもあります。