スクラッチでは、複数のスプライトのプログラムを同時に処理することができます。
ただし、複数のスプライト間で共通の変数とリストを使う場合は、注意が必要です。
こちらでは、スクラッチの並列処理と、注意点を説明しています。
並列処理?
プログラミングの世界では、処理を同時に並列して行うことを「並列処理」といいます。
例えば、こちらは、緑の旗をクリックすると、アナログ時計が現在の時刻を示すプログラムです。
「時針」「分針」「秒針」を、それぞれスプライトにしています。
(画像をクリックすると大きくなります。)
こちらが、それぞれのスプライトのプログラムです。
3つのスプライトとも「緑の旗が押されたとき」にプログラムが実行され、「ずっと」ブロックで、ぐるぐると反復処理をしています。
このように3つのプログラムの処理を処理を同時に並列して行うことを「並列処理」といいます。
ただし、同時といっても、スクラッチでは、一緒に処理をしているわけではありません。
スクラッチでは、それぞれの処理を高速で切り替えながら、1処理ずつ行なっています。
それでも同時に処理されているように見えるのは、プログラムの処理が高速で、人間の目では捉えられないほど速いからです。
アナログ時計のプログラムで、どのスプライトが先に処理されているのか、まったく分かりませんよね。
それぐらい、プログラムの処理の速度は、高速です。
スクラッチでの並列処理の順番は?
では、実際にスクラッチでの並列処理は、どのような順番で処理されているでしょうか?
先に答えを言うと、一番上にあるスプライトから順に処理されています。
一番上とは、一番上の層つまりレイヤーのことです。
レイヤーとは?
レイヤーとは、透明の画用紙のようなもので、スクラッチでは、レイヤーのことを「層」と表現します。
具体的にレイヤーとはどのようなものなのか確認してみましょう。
スクラッチの新しいファイルを開いて、「スプライトを選ぶ」からスプライトを追加します。
今回は、リンゴ(Apple)を追加しました。
すると、リンゴがスクラッチキャット(スプライト1)の上に重なっているのが分かります。
つまり、1層目のレイヤーにリンゴ、2層目のレイヤーにスクラッチキャットがいるということです。
もう一つバナナ(Bananas)のスプライトを追加しました。
今度は、バナナが一番前でリンゴ、スクラッチキャットの順で重なっているのが分かります。
今度は、1層目のレイヤーにバナナ、2層目のレイヤーにリンゴ、3層目のレイヤーにスクラッチキャットとなりました。
現在の層では、「バナナ」「リンゴ」「スクラッチキャット」の順にプログラムが処理されます。
並列処理の順番を確認
実際に、スクラッチでの並列処理の順番を確認してみましょう。
まず、変数「x」を作って、中身を空にしておきます。
次に、それぞれのスプライトのプログラムは、このようにします。
こちらでは、緑の旗が押されたときに、変数「x」にスプライトの名前を付けたす処理をしています。
1層目のレイヤーに「バナナ」、2層目のレイヤーに「リンゴ」、3層目のレイヤーに「スクラッチキャット」の順番で、緑の旗をクリックすると、このような結果になりました。
変数xの中身を確認すると「|Bananas|Apple|スクラッチキャット」となっていますよね。
つまり、レイヤの順番と同じ、「バナナ」「リンゴ」「スクラッチキャット」の順に処理されたということです。
今度は、1層目のレイヤーに「リンゴ」、2層目のレイヤーに「スクラッチキャット」、3層目のレイヤーに「バナナ」の順番で、緑の旗をクリックすると、このような結果になりました。
こちらも、レイヤーの順番で処理されているのが、分かります。
このように、スクラッチの並列処理は、レイヤーの順番で処理されるので、共通の変数を使う場合は、変数の値が意図しない値になることもあります。
その場合は、ローカル変数を使うか、「▢へ移動する」「〇層▢(レイヤー)」ブロックを使って、レイヤーの順番を指定するようにしましょう。
スクラッチの処理について詳しく知りたい方は、「スクラッチはマルチスレッド!処理の優先順位を徹底解説!」で詳しく解説していますので、こちらも確認しましょう。
まとめ
ここまで、スクラッチの並列処理と、注意点を説明しました。
スクラッチの並列処理では、変数だけでなく、リストを使う場合も注意が必要なので、気を付けましょう。