まずは、サクッと敵機のスプライトを用意します。
敵機の出現場所の問題
さて、ではこの敵機を出現させるわけですが、一つ問題があります。本当であれば、敵機を画面外から出現させたいところなんですが、Scratchの仕様で画面外に完全に出すことが出来ません。
画面外に出そうとしても、ピヨンって画面内に戻ってしまいます。
これは、X座標をブロックで指定しても同じです。ある程度はは見出せるけど、完全に外には出ないんです。
まぁ、いろいろ方法は考えられるけど、それはまた別の機会に。
今回は、画面から半分程度はみ出た状態で出現させます。
つまり、X座標を画面の右端の240の位置からスタートです。
出現したら、左端に到着するまで進み続けます。
弾を発射させたときと同じように、敵機もクローンとして出現させて、画面の端まで(この場合はX座標が-240以下となるまで)行ったらクローンを削除します。
縦位置(Y座標)は単純に乱数で設定させています。
出現するタイミングは、背景のスクリプトで乱数で発生させます。
ここでもちょっとしたテクニック。
もともと「STARTしたよ」を受け取ったタイミングでBGMを鳴らすブロックがありました。
ここの「ずっと」ループの中にクローンを作るブロックを入れても良いんだけど、そうするとうまく行きません。
なぜなのか。
BGMを鳴らすブロックが「終わるまで○○○を鳴らす」になっているからですね。このブロックは音楽が最後まで鳴らないと次のブロックへ進みません。なので、長い音楽だとなかなか次のブロックへ行かないんですね。
そこで、イベント「STARTしたよを受け取ったとき」を2つ作るわけです。
こうすることで、同時に2つのプログラムがスタートして実行されます。
なので、BGMが鳴り終わるまで待っていても、もう一つのプログラムで敵機を発生させられるってわけですね。
当たり判定も作っちゃおう
せっかくなので、当たり判定も作っちゃいます。作るプログラムは、弾の処理と敵機の処理です。
単純に考えると敵機の処理として「弾に触れた」で自身を消せば良いと思いそうなのですが、これだと弾が貫通して飛んでいってしまいます。
なので、弾と敵機の両方で当たり判定が必要になります。
「弾の処理」
端に触れるまで繰り返すループの中で「敵機に触れたなら」の判定をします。
触れた時に「当たったよ」とメッセージを送ることで敵機側の処理を開始させます。
ここで一つポイントがあります。
それは、メッセージを送ってすぐに弾のクローンを削除しては駄目です。そうすると、敵機の処理が始まる前にクローンが削除されてしまうことがあって、敵機の処理ができなくなる事があります。
そんな時は「当たったよを送って待つ」ブロックを利用します。このブロックは、メッセージを送ったら、受け取った側の処理が終わるまで待つブロックです。
これで、敵機の処理が終わったら弾を消すことが出来ます。
「敵機の処理」
敵機側の処理では、メッセージを受け取ったら、敵機側でも弾に触れているかをチェックします。これは、メッセージは全てのスプライトが受け取るので、メッセージを受け取ってそのまますぐにクローンを消す処理にすると、全ての敵機スプライトが消えてしまうんですね。
なので、メッセージを受け取って尚且つ弾に触れている時は消すという処理にします。
これで、いよいよシューティングゲームっぽくなってきました。
サンプルプログラムでは得点をつけてみましたが、まぁこれは説明はいらないでしょう。
次回は自機の当たり判定を作りましょう。
サンプルプログラム
「敵機を作る」