当たり判定とスコア加算処理の作成

飛行機やヘリコプターにバスケットボールが当たった場合の処理を実装します。

スプライトとスプライトが接触した場合、この場合、飛行機とバスケットボールや、ヘリコプターとバスケットボールが当たったら、スプライトを消す処理を実装します。

 

それではまず、飛行機(スプライト2)にバスケットボール(スプライト4)が当たったら(触れたら)飛行機のスプライトを消す処理を実装します。スプライトリストの飛行機のスプライトを選択した状態で、スクリプトエリアに以下のスクリプトを追加してください。

プログラムを実行してバスケットボールを飛行機に当たるよう発射(上向きカーソルキー)してみてください。バスケットボールが飛行機に触れると、飛行機のスプライトが消えましたか?

スクリプトの説明をします。

 

「緑の旗がクリックされたとき」

プログラムを開始するとこのブロックから下に順に実行されます。

「ずっと」

処理を繰り返します。

「もし スプライト4 に触れた なら」

2つのブロックから構成されています。もし飛行機のスプライト(スプライト2)がバスケットボールのスプライト(スプライト4)に触れたら、以下の処理を実行します。

このブロックで当たり判定を行っています。

「隠す」

飛行機のスプライト(スプライト2)を非表示にします。

 

当たり判定は、「もし なら」のブロックを使って実装しています。

 

例えば敵を倒して、ただ敵が消えるのと、派手な爆発の音やエフェクトがあった後敵が消えるのとでは、どちらが楽しいですか?後者が圧倒的にいいですよね。現在のスクリプトにも簡単なエフェクトを追加してみましょう。

 

先ほどのスクリプトを以下のように改変してください。

飛行機にバスケットボールが当たった際にスプライトを消す前に、SEを再生し、消滅エフェクトを追加しました。現状、SEが選択されていません。「音」タブを選択し音源を追加します。

「読み込み」ボタンをクリックしてください。

「Effects」フォルダをダブルクリックします。

「WaterDrop」を選択し「OK」ボタンをクリックします。

WaterDropという音が追加されました。スクリプトタブをクリックし、「の音を鳴らす」のブロックのドロップダウンリストから先ほど追加した「WaterDrop」を選択します。

それでは再度プログラムを実行してバスケットボールを飛行機に当ててみてください。当たると、音が鳴り、飛行機がモザイクのように消えてゆくかと思います。

 

「の音を鳴らす」は音を鳴らすブロックです。このスクリプトでは「WaterDrop」という音を鳴らしています。

「20回繰り返す」は「ずっと」と同じで繰り返し処理をする命令ですが、繰り返す回数を指定しています。このスクリプトでは、「ピクセル化 の効果を 25 ずつ変える」を20回繰り返しています。

「ピクセル化 の効果を 25 ずつ変える」の「の効果を ずつ変える」は、表示しているスプライトに何かしらの画像効果を与える命令です。このスクリプトでは、「ピクセル化」という画像効果を25ずつ変えていて、それを20回繰り返しています。そうすることで、さも飛行機が少しづつ消えてゆくように見えるようになりました。他にもさまざまな画像効果があります。変更して実行してみるといいでしょう。

 

さて、実行結果を確認すると、飛行機にバスケットボールが当たった後でもバスケットボールが表示され続けています。飛行機の消滅と同時にバスケットボールも非表示にします。まず先ほどのスクリプトを以下のように改変してください。

新たに、「 を送る」のブロックを追加しました。続いて、ドロップダウンリストを選択し、「新規」を選択します。

すると以下のように「メッセージの名前」を入力する画面が表示されます。

「atari」と入力して「OK」ボタンをクリックします。

「atari を送る」とは、「atari」というメッセージを送信する働きをします。このメッセージは、他のスプライトやスクリプトで受信することが可能です。

 

スクラッチでは、スクリプトは対象となるスプライトに実装をしています。別のスプライトでは、その状態を知ることができません。そこで、メッセージの機能を使って、飛行機(またはヘリコプター)が衝突したタイミングで、バスケットボールに「当たったよ!」とメッセージを送っている訳です。

 

これから実装するスクリプトは、バスケットボールのスプライトが、「atari」のメッセージを受信し、スプライトを非表示にする働きをします。

 

バスケットボールのスクリプトが選択されている状態で、以下のスクリプトを追加してください。

プログラムを実行してください。バスケットボールが飛行機に当たると、飛行機のスプライトが非表示になるタイミングでバスケットボールのスプライトも非表示になりました。

 

ヘリコプターにも飛行機と同様な処理を追加します。スプライトリストのヘリコプターのスプライトを選択した状態で、ヘリコプターのスクリプトエリアに以下のスクリプトを追加してください。

再度プラグラムを実行して確認してください。バスケットボールがヘリコプターに当たっても、飛行機と同様に消えることを確認してください。

 

続いて、飛行機やヘリコプターにバスケットボールが当たったら、スコアを加算する処理を実装します。

 

スコアは、「変数」を使用して実装します。

変数とは、プログラミングでは、値が入っている箱のようなもので、自由に値を変更することができます。いつでもその中身(数値)を調べたり、ステージ上に表示することが可能です。また、プログラムが実行されている間この値は保持されます。

 

最初スコアは0です。敵を倒すと1点プラスされるように実装します。変数を作るには、ブロックパレットの「変数」を選択し、「新しい変数を作る」をクリックします。

変数名に「score」と入力し、「OK」ボタンをクリックします。するとブロックパレットに変数「score」が追加作成されました。

同時にステージにも変数が表示されます。(表示させないことも可能です。)

変数scoreの表示位置が飛行機とかぶりそうなので、マウスでドラッグして移動させておきます。

続いて、スプライトリストで「背景」が選択されている状態で以下の2つのスクリプトを追加してください。

プログラムを実行してみましょう。プログラムを開始するとスコアが0点になります。飛行機やヘリコプターにバスケットボールが当たると、スコアが1点づつ増えるようになりました。

スクリプトの説明をします。

 

「緑の旗がクリックされたとき」

プログラムを開始するとこのブロックから下に順に実行されます。

「score を 0 にする」

変数scoreを0に設定します。このようにプログラム開始時に必ず変数の初期値を設定するようにしましょう。

 

「atari を受け取ったとき」

「atari」のメッセージを受け取った時にこのスクリプトが実行されます。

「score を 1 ずつ変える」

変数scoreに1をプラスします。

 

敵の移動、プレイヤーの移動、玉の発射、あたり判定、スコア加算と、ゲームを構成する要素の大半が完成しました。続いて、背景の設定、BGMの再生、ゲーム終了処理を実装して、完成となります。あともう少しです。まずは見様見真似で結構ですので、体験してください。なお、本章の最後には、各スプライトに実装したすべてのスクリプトをまとめて掲載しておきますので、もしもうまく動かない場合は、デバッグ等で活用してください。

あわせて読みたい