Scratchでユーザーの操作によることなくスクリプトを実行したいときに便利な「~を送る」と「~を送って待つ」のメッセージを送信するためのブロックがあります。
このメッセージはプログラム全体に送られますが、使い方としては複数のスプライト間でやりとりを行う場合、「~キーが押されたとき」などの異なるイベントと結びつける場合、複数のスクリプトを同時に実行する場合などの場面で利用できます。
しかし、「~を送る」と「~を送って待つ」ブロックを適切に使い分けないと思いどおりの結果が得られません。
そこで今回は「~送る」ブロックと「~を送って待つ」ブロックの動作の違いを確認して、仕様を正しく理解したいと思います。
この記事では、メッセージを送るときに使う2種類のブロック「~を送る」「~を送って待つ」の違いについて解説します。
「~を送る」ブロックの仕様について
「~を送る」ブロックについて、Scratchウィキには以下のように記載されています。
() を送るブロック(イベントブロック/スタックブロック)は、メッセージをScratchプログラム全体に送るブロックである。このブロックを実行すると、すべてのスプライトにおいて、送信メッセージに対応する() を受け取ったときブロックのスクリプトが実行を開始する。 このブロックは、相手先のスクリプトの実行が終了するのを待たず、次のブロックに処理を渡す(この点が() を送って待つとは異なる)。このようなメッセージの送受信は、スプライトやスクリプト間で何らかのやりとりを行うときに便利である。
Scratch wiki-()を送るブロック
「~を送る」ブロックは、プログラム全体に送られるので、他のスプライトだけでなくステージでも送った側のスプライトも含めて、誰でも受け取ることが可能です。
そして「~を送る」ブロックの次以降にブロックが続いていた場合、メッセージを送ったらすぐに次のブロックの処理を行うということです。
つまり、メッセージを受け取った側の処理が終わっていようがいまいが関係なく送りっぱなしで、次のブロックの処理を行うということになります。
ここで送りっぱなしにしないのが「~を送って待つ」ブロックの役割なのですが、それを次で説明します。
「~を送って待つ」ブロックの仕様について
「~を送って待つ」ブロックについて、Scratchウィキには以下のように記載されています。
() を送って待つブロック(イベントブロック/スタックブロック)は、Scratchプロジェクト全体にメッセージを送るブロックである。このブロックを実行すると、すべてのスプライトにおいて、送信メッセージに対応する「() を受け取ったとき」ブロックのスクリプトが実行を開始する。このブロックの場合は、各スクリプトにメッセージを送ったあと、受け取ったすべてのスクリプトが動作を終えるまで処理を次に渡さず、その地点で待ちつづける。(この点が、メッセージを受け取った側のスクリプトが終わるのを待たずに、処理を次のブロックに渡す() を送ると異なる)。このようなメッセージの送受信は、スプライトやスクリプト間で何らかのやりとりを行うときに便利である。
Scratch wiki-()を送って待つ
「~を送って待つ」ブロックは、プログラム全体に送られるので、他のスプライトだけでなくステージでも送った側のスプライトも含めて、誰でも受け取ることが可能です。
そして「~を送って待つ」ブロックの次以降にブロックが続いていた場合、メッセージを受け取った側の処理が終わるまで待ってから次のブロックの処理を行われます。
つまり、「~を送って待つ」ブロックの次のブロックは、メッセージを送りっぱなしにはせず、そちらの処理が終わるまで次のブロックの処理の実行を待っているということになります。
この「処理が終わるまで待つ」というのが「~を送る」ブロックとの違いです。
「~を送る」と「~を送って待つ」ブロックの動作の違いについて
それでは2つのブロックの動作に違いについて、実例で確認していきましょう。
スプライトは下記のように「ステゴ」「ティラノ」「ボタン」の3種類を用意します。
作りたいプログラムは、以下のような内容だとします。
- スタートボタンを押すと「ステゴ」が「相撲で勝負しよう」としゃべる
- その後に「ティラノ」が「よし!勝負だ」としゃべる
- その次に「ボタン」が「はっけよ~い、のこった~!」としゃべる
- 最後に「ステゴ」と「ティラノ」が歩み寄ってぶつかる
上の1~4の順番にブロックが実行されるようにメッセージを使ってプログラムを作っていきます。
「~を送る」ブロックを使った例
「~を送る」ブロックだけを使った場合のプログラム例を示します。
【ステゴ】のスクリプト
【ティラノ】のスクリプト
【ボタン】のスクリプト
ボタンスプライトが押されると「1番目を送る」ブロックが実行された後、すぐに「2番目を送る」ブロックが実行され、その直後に「~と2秒言う」ブロックが実行されます。
そのため、「ステゴ」と「ティラノ」と「ボタン」がしゃべるタイミングは同時になってしまっています。
ボタンがしゃべり終わるまで2秒だけ待ち時間が発生しますが、それが終わるとすぐに「3番目を送る」と「4番目を送る」がほぼ同時に実行されるので、「ステゴ」と「ティラノ」は同時に歩み寄り始めます。
「~を送って待つ」ブロックを使った例
「~を送って待つ」ブロックを組み合わせたプログラム例を示します。
【ステゴ】のスクリプト
【ティラノ】のスクリプト
【ボタン】のスクリプト
ボタンスプライトが押されるとまず「1番目を送って待つ」ブロックが実行されます。
この次のブロックである「2番目を送って待つ」ブロックが実行されるためには、「1番目に送った待つ」ブロックを受け取った先のスクリプトが終わるのを待つ必要があります。
「ステゴ」のスクリプトが「1番目を受け取ったとき」ブロックの次に「相撲で勝負しようと2秒言う」となっているので、このブロックの処理が終わってから「2番目を送って待つ」ブロックが実行されます。
すると「ティラノ」が「よし!勝負だと2秒言う」 ので、そのブロックの処理が終わってから「ボタン」が「はっけよ~い、のこった~!と2秒言う」ブロックが実行されます。
最後に「3番目を送る」と「4番目を送る」がほぼ同時に実行され、「ステゴ」と「ティラノ」は同時に歩み寄り始めます。
このように「~を送って待つ」ブロックは、メッセージを送るブロックをどのような順番で実行させるかをコントロールできることが特徴であり、最大のメリットになっています。
まとめ
今回は、メッセージを送るときに使う2種類のブロック「~を送る」「~を送って待つ」の違いについて明らかにしました。
以下にこの記事のポイントをまとめます。
- 「~を送る」ブロックは、送ったメッセージを受け取った側の処理が終わるのを待たずに次のブロックの処理をすぐに行う
- 「~を送って待つ」ブロックは、送ったメッセージを受け取った側の処理が終わるまで待ち、終わったら次のブロックの処理を行う
- 「~を送って待つ」ブロックは、メッセージを送るブロックの処理の順番をつけることができる
複雑で大きなプログラムが作れるようになると、「~を送る」ブロックと「~を送って待つ」ブロックの違いを理解していることがとても重要になってきますので、簡単なプログラムを作っているうちに使い分けができるように慣れておきましょう。