オブジェクトとの接触判定
先に高速ループの関連記事で四方向移動処理に関する解説をしています。このレッスンをやってない方は先に済ませてからこちらの記事をお読みください。
オブジェクトグループの活用
まずオブジェクトグループを「コントロール」と「コリジョン」で別々に分けて処理します。
オブジェクトグループ名「コリジョン」で行っている処理について。
事前に求められた移動量を用いて、高速ループを使ってループを回しながらスプライトの実座標 XY に移動を適用するという処理を行なっています。
ちょっとコ難しく書きましたが、要するに移動と衝突判定処理をまとめたものです。
スプライトの移動、そして移動させた先に衝突を検知できるオブジェクト(スプライトやバックグラウンド)があればそこで高速ループを停止し、高速ループを終了する前に衝突を検知する直前の座標にスプライトを戻してやること・・です。
文章で読むとなんじゃこれややこしい?
が、やってみると意外と簡単。なぜならば?
例えば車を衝突させないで安全に運転するためには、障害物の有り無しを当たる前に察知しなければなりませんが、この処理をイベント使って実現するためには実際に一回衝突させるつもりで車を移動させればいいのです。
そして実際に衝突したら衝突する瞬間一歩手前に時間を巻き戻してそこで時間を停める…こんな処理です。魔法みたいだね?
くどいようですがこのような処理は慣れるしか無いし、感覚が身につけば自由に応用できるようになります。
高速ループを回して座標を 1 ドットずつ移動させるってことは、毎回スプライトをどっかにブツケるつもりで移動させてる。
ぶつかるオブジェクトが無かったらそのまま処理する、ぶつかったらぶつかる直前に戻して高速ループ終了っ・・て処理を 1 フレームでいっぺんに全部行うってことです。
ループ処理は多用しすぎると 1 フレームで処理する内容が膨大に増えてしまうのでそれは望ましくないから、高速ループは必要以上に多用するなと言われるのです。
もっとも「多用するな」の言葉が実際に意味を持つようになるのは、もっともっとゲームを作り込んで処理が複雑になった時点からのことで、この程度の処理を行っている段階ではこの説教もあまり意味を成しません。
改造版サンプルについて
デバッグ用のショートカットボタンを押すとコリジョン処理有効・無効を切り替えられますが、これは内部フラグ判定で切り替えを行っています。
オブジェクトを実際に移動させないとコリジョンを検出できないのでスプライトの座標移動とコリジョンの検出は高速ループ処理が一体化されています。
あとは特徴‥というものではありませんが、高速ループを使って衝突判定をする際に、 X (横)と Y (縦)用に二つの高速ループを使っていて、その二つの高速ループをほぼ同時にイベントで実行してます。
高速ループ処理はそれぞれ先に「座標移動」、つまりスプライトの座標を実際に変更(座標移動)する処理を実行させています。そしてここがこの処理の一番重要な所、座標移動して「もしも衝突を検知したら~」というイベントを挿んで、実際「衝突」が検知された場合はスプライトの実座標をぶつかる直前のものに戻してから高速ループ処理を止めます。
ここまでの処理を振り返って
まず MMF2 の高速ループは難しいと感じていた人でも、このサンプルでは高速ループは二つしか使ってないしループ処理してる部分は実質たったの4行、これは必ず理解できます。この手の処理を難しいと思い込まないで下さい。
あとはオリジナルのサンプルと比較してキー押し検出部分も実質 4 行でしたが、アクションゲームを作る場合キー検出とかはいろんなキー押しパターンを実直に網羅する方法はあまりお勧めしません。
パターンを網羅するよりも同時に押される可能性のあるキーが何個あるかに注目してください。そしてキー押しを検出したらあとは計算や比較で処理をするのが望ましい・・というわけです。
でも基本的には動けば良いので人がどんな作り方してても、これはこうしなければいけないってことは絶対ありません。特に MMF2 はオーサリングツールだしとりあえず楽してそれっぽく動かせればいいんスよ・・が筆者の基本的なスタンスです。そして今回、筆者の場合こう考えているから実際作ったらこの処理はこうなりましたよっ・・というわけで以上、自作 8 方向移動コリジョン付きの解説完了。
次はこの 8 方向移動を使って実際に簡単な縦シューティングゲームを作ってみましょう、です。これはすでに解説用に縦シューティングを作ってありますので、これを使って手順を解説していきます。稚拙な筆者作ですがどうぞご容赦ください。ダウンロード→★