ある条件を満たしたときに特定のスクリプトだけを止めたいときなどに便利な止める系ブロックなるものがあります。
止める系ブロックとは、「制御」カテゴリにある「すべてを止める」「このスクリプトを止める」「スプライトの他のスクリプトを止める」ブロックのことです。
これらのブロックを活用してスクリプトの止め方を工夫することで、特定の条件でステージを切り替えたり、スプライトの動きを止めたり、止めた動きを再開したりすることができるようになります。
しかし、「すべてを止める」ブロックについては分かりやすいものの、その他2つのブロックについてはどのように使えばいいのか分からない人もいるのではないかと思います。
そこで今回は、3つの止める系ブロックの動作の違いをそれぞれ実例を用いて確認して、仕様を正しく理解できるようにしていきます。
この記事では、特定の条件でスクリプトを止めることができる3つの止める系ブロック(すべてを止める・このスクリプトを止める・スプライトの他のスクリプトを止める)の違いについて解説します。
「~を止める」ブロックの仕様について
「~を止める」ブロックについて、Scratchウィキには以下のように記載されています。
() を止めるブロック(制御ブロック)は引数によってブロックのかたちが変わる唯一のブロックである(引数が「すべて」「このスクリプト」のときはキャップブロック、「スプライトの他のスクリプト」のときはスタックブロック)。対象のプログラムを止める役割を持つ。Scratch 2.0で、すべてを止めるブロック、スクリプトを止めるブロックの代わりに追加されたブロックで、これらに加えて、そのスプライトの範囲で、現在のスクリプト以外のスクリプトを止める機能が追加された。
Scratch wiki-()を止めるブロック
「すべてを止める」ブロックは、プログラム全体に対して有効で、他のスプライトだけでなくステージのスクリプトも含めてすべてのスクリプトが止まります。
「このスクリプトを止める」ブロックは、このブロックが組み込まれているスクリプトの先頭から最後までのブロックが止まります。それ以外のスクリプトには影響しません。
「スプライトの他のスクリプトを止める」ブロックは、このブロックが組み込まれているスクリプトの先頭から最後までのブロックを除いて、そのスプライトの中の他のスクリプトが止まります。その他のスプライトやステージには影響しません。
「~を止める」ブロックの動作の違い
それでは3つの「~を止める」ブロックの動作に違いについて、実例で確認していきます。
スプライトは下図のように「ネコ」スプライトを1つだけを使います。
すべてのプログラムで下記のような共通の動きをするようにして、どのような違いが出るか確認できるようにしています。
- 「ネコ」スプライト本体は、身体の色を変えながら左右に動き続ける
- クローンを一体つくり、クローンも左右に動き続ける(身体の色は変化しない)
「すべてを止める」ブロックの場合
「すべてを止める」ブロックを使った場合のプログラム例を示します。スペースキーを押すとブロックが実行されるようになっています。
下図のアニメーションを見てください。
スペースキーを押すと、オリジナルは動きを止めて色を変えるのもやめました。クローンの方は消えてしまいました。
このことから「すべてを止める」ブロックが実行されると、下図のように「緑の旗でスタート」で始まっている2つのスクリプトと「クローンされたとき」で始まっているスクリプトのがすべてのスクリプトが止まったことが分かります。
「このスクリプトを止める」ブロックの場合
「このスクリプトを止める」ブロックを使った場合のプログラム例を示します。スペースキーを押すとブロックが実行されるようになっています。
下図のアニメーションを見てください。
スペースキーを押すと、オリジナルは動きを止めますが色の変化は止まっていません。クローンの方は動き続けています。
このことから「このスクリプトを止める」ブロックが実行されると、下図のように「このスクリプトを止める」ブロックが含まれているスクリプトだけが止まって、それ以外のスクリプトは止まらない(影響を与えない)ことが分かります。
【疑問】クローン側にブロックを入れたらどうなるか?
今度はクローン側に「このスクリプトを止める」ブロックを組み込んでみるとどうなるか実験してみます。
結果は、クローンの動きだけが止まり、オリジナルの動きと色の変化は継続しています。
このことから「このスクリプトを止める」ブロックは、クローンの中でも実行できることが分かります。
「スプライトの他のスクリプトを止める」ブロックの場合
「スプライトの他のスクリプトを止める」ブロックを使った場合のプログラム例を示します。スペースキーを押すとブロックが実行されるようになっています。
下図のアニメーションを見てください。
スペースキーを押すと、オリジナルは動き続けていますが色の変化が止まりました。クローンの方は動き続けています。
このことから「スプライトの他のスクリプトを止める」ブロックが実行されると、下図のようにオリジナルのスクリプトのうち「スプライトの他のスクリプトを止める」ブロックが含まれていないスクリプトが止まって、それ以外のスクリプトは止まらない(影響を与えない)ことが分かります。
また、クローンのスクリプトが止まらないことから、「スプライトの他のスクリプトを止める」ブロックは、クローンには影響を与えないということになります。これは要注意ですね。
【疑問】クローン側にブロックを入れたらどうなるか?
では逆にクローン側に「スプライトの他のスクリプトを止める」ブロックを組み込んでみるとどうなるか実験してみます。
結果、何度スペースキーを押してもまったく変化しませんでした。
このことから「スプライトの他のスクリプトを止める」ブロックは、クローンの中では動かないことが分かります。
以上より、「スプライトの他のスクリプトを止める」ブロックは『同じスプライトの中にあるクローン以外のスクリプトを止める』ことができるもの、と理解できます。
まとめ
今回は、3つの止める系ブロック(すべてを止める・このスクリプトを止める・スプライトの他のスクリプトを止める)の違いについて明らかにしました。
以下にこの記事のポイントをまとめます。
- 「すべてを止める」ブロックは、クローンも他のスプライトも含めてすべてのスクリプトを止める(クローンはステージ上から消去される)
- 「このスクリプトを止める」ブロックは、このブロックが含まれているスクリプトを止める(ただし、クローンの外からクローンに対しては影響を与えないが、クローンの中での実行は可能)
- 「スプライトの他のスクリプトを止める」ブロックは、同じスプライトの中にあってこのブロックが含まれていないスクリプトを止める(ただし、クローンの外からクローンに対しては影響を与えない、またクローンの中では実行できない)
「~を止める」ブロックは、複雑で大きなプログラムを作れるようになると大活躍してくれるブロックなので仕様をきちんと理解しておきたいところです。
やはり「スプライトの他のスクリプトを止める」ブロックが一番分かりにくいですね。そもそも日本語が分かりにくい。。。
ですが2つのポイントだけ押さえておけばいいと思います。1つ目は同じスプライト内だけで有効、2つ目はクローンには効かない、です。
次の記事では止める系ブロックと「~を送る・~を受け取ったとき」ブロックを組み合わせたときにどのような動きとなるかを実験していますので、ぜひこちらの記事も合わせて読んでみてください。↓↓↓