前回に引き続き止める系ブロックの仕様について、正しく理解するためにスクリプトを例示して説明していきます。
前回との違いは、止める系ブロックと「~を送る・~を受け取ったとき」ブロックを組み合わせて実行した場合、どのような動きになるのかを確認することと、その時の「~を止める」ブロックの仕様を明らかにすることです。
止める系ブロックとは、「制御」カテゴリにある「すべてを止める」「このスクリプトを止める」「スプライトの他のスクリプトを止める」ブロックのことです。
この記事では、「~を送る・~を受け取ったとき」ブロックと3つの止める系ブロック(すべてを止める・このスクリプトを止める・スプライトの他のスクリプトを止める)を組み合わせたときの仕様の違いについて解説します。
「~を止める」ブロックの仕様について
「~を止める」ブロックについて、Scratchウィキには以下のように記載されています。
() を止めるブロック(制御ブロック)は引数によってブロックのかたちが変わる唯一のブロックである(引数が「すべて」「このスクリプト」のときはキャップブロック、「スプライトの他のスクリプト」のときはスタックブロック)。対象のプログラムを止める役割を持つ。Scratch 2.0で、すべてを止めるブロック、スクリプトを止めるブロックの代わりに追加されたブロックで、これらに加えて、そのスプライトの範囲で、現在のスクリプト以外のスクリプトを止める機能が追加された。
Scratch wiki-()を止めるブロック
「すべてを止める」ブロックは、プログラム全体に対して有効で、他のスプライトだけでなくステージのスクリプトも含めてすべてのスクリプトが止まります。
「このスクリプトを止める」ブロックは、このブロックが組み込まれているスクリプトの先頭から最後までのブロックが止まります。それ以外のスクリプトには影響しません。
「スプライトの他のスクリプトを止める」ブロックは、このブロックが組み込まれているスクリプトの先頭から最後までのブロックを除いて、そのスプライトの中の他のスクリプトが止まります。その他のスプライトやステージには影響しません。
「~を止める」ブロックの動作の違い
それでは3つの「~を止める」ブロックと「~を送る・~を受け取ったとき」ブロックを組み合わせたときの動作に違いについて、実例で確認していきます。
スプライトは下図のように「ネコ」スプライトを1つだけを使います。
すべてのプログラムで下記のような共通の動きをするようにして、どのような違いが出るか確認できるようにしています。
- 「ネコ」スプライト本体は、身体の色を変えながら左右に動き続ける
- クローンを一体つくり、クローンも左右に動き続ける(身体の色は変化しない)
「すべてを止める」ブロックの場合
「すべてを止める」ブロックを使った場合のプログラム例を示します。スペースキーを押すとブロックが実行されるようになっています。
下図のアニメーションを見てください。
スペースキーを押すと、オリジナルは動きを止めて色を変えるのもやめました。クローンの方は消えてしまいました。
このことから「すべてを止める」ブロックが実行されると、下図のように「緑の旗でスタート」で始まっている2つのスクリプト、「メッセージ1を受け取ったとき」で始まるスクリプト、「クローンされたとき」で始まるスクリプトのすべてのスクリプトが止まったことが分かります。これは当然ですね。
「このスクリプトを止める」ブロックの場合
「このスクリプトを止める」ブロックを使った場合のプログラム例を示します。スペースキーを押すとブロックが実行されるようになっています。
下図のアニメーションを見てください。
スペースキーを押すと、オリジナルは動きを止めますが色の変化は止まっていません。クローンの方は動き続けています。
このことから「このスクリプトを止める」ブロックが実行されると、下図のように「このスクリプトを止める」ブロックが含まれているスクリプトだけが止まって、それ以外のスクリプトは止まらない(影響を与えない)ことが分かります。
なお、前回の記事でも書きましたが、スペースキーを押すとクローンのスピードが遅くなっています。スペースキーを押すと「メッセージ1を受け取ったとき」のスクリプトだけが止まり、「クローンされたとき」で始まるスクリプトは動いたままのため、10歩ずつ動いていたものが半分の5歩ずつ動くにスピードダウンしています。このことは本節だけでなく記事全体を通して共通の事象です。
「スプライトの他のスクリプトを止める」ブロックの場合
「スプライトの他のスクリプトを止める」ブロックを使った場合のプログラム例を示します。スペースキーを押すとブロックが実行されるようになっています。
下図のアニメーションを見てください。
スペースキーを押すと、オリジナルは動き続けていますが色の変化が止まり「オリジナルです」というセリフも消えました。クローンの方は動き続けています。
このことから「スプライトの他のスクリプトを止める」ブロックが実行されると、下図のようにオリジナルのスクリプトのうち「スプライトの他のスクリプトを止める」ブロックが含まれていないスクリプトが止まって、それ以外のスクリプトは止まらない(影響を与えない)ことが分かります。
また、クローンのスクリプトが止まらないことから、「スプライトの他のスクリプトを止める」ブロックは、クローンには影響を与えないということになります。これは要注意です。
前回と同様ですが、以上のことより「スプライトの他のスクリプトを止める」ブロックは『同じスプライトの中にあるクローン以外のスクリプトを止める』ことができるもの、と言えます。
前回記事の内容と今回記事の内容で「スプライトの他のスクリプトを止める」ブロックの使いどころが明確になりました。
下記2つの条件の両方を満たすプログラムを作りたいときに利用すべきブロックだと言えます。
- 特定の条件のとき、スプライト本体の一部の動きだけを止めたい
- ただし、クローンには影響を与えたくない
まとめ
今回は、「~を送る・~を受け取ったとき」ブロックと3つの止める系ブロック(すべてを止める・このスクリプトを止める・スプライトの他のスクリプトを止める)を組み合わせたときの仕様の違いについて明らかにしました。
以下にこの記事のポイントをまとめます。
- 「すべてを止める」ブロックは、クローンも他のスプライトも含めてすべてのスクリプトを止める(クローンはステージ上から消去される)
- 「このスクリプトを止める」ブロックは、このブロックが含まれているスクリプトを止める(ただし、クローンの外からクローンに対しては影響を与えない)
- 「スプライトの他のスクリプトを止める」ブロックは、同じスプライトの中にあってこのブロックが含まれていないスクリプトを止める(ただし、クローンの外からクローンに対しては影響を与えない)
今回、「スプライトの他のスクリプトを止める」ブロックの使いどころを明らかにできたのが一番の収穫になりました。
「このスクリプトを止める」ブロックだけでも「スプライトの他のスクリプトを止める」ブロックの役割を代替できそうですが、「スプライトの他のスクリプトを止める」ブロックを使えばプログラムが少し単純化できると思います。