Scratch:ねこのコピー3:スプライトのクローンを生成して見た目上の複製を実現

この記事では、Scratchのねこをコピーして複数表示する方法の1つとして、ねこのスプライトのクローンを生成して、見た目上ねこを複数して表示する方法を説明し、あわせて、スプライトとそのクローンについての違いなどを説明します。

[目次]
1.ステージ上に同じねこを複数表示する方法はいっぱいある!
2.ねこのスプライトのクローンを生成して見た目上の複製を実現
2.1.ねこの絵はスプライト
2.2.スプライト
2.3.スプライトのクローンの生成方法
3.スプライトとクローンの比較
3.1.クローンは実行中に作成
3.2.[クローンされたとき]ブロックで始まるブロックだけがクローンを制御できる
3.3.生成できるクローンの数には制限がある
3.4.クローンの消し方
4.おまけ

1.ステージ上に同じねこを複数表示する方法はいっぱいある!

Scratch3.0のエディターの画面右上の四角い領域はステージと呼ばれるプログラムのグラフィックの出力領域です。

エディターを開いた直後や、メニューの[ファイル]にある[新規]を選択してプログラムを新規作成状態にした直後のステージは、真っ白な背景のど真ん中にねこの絵が1つ表示された状態です。

起動直後のエディターとそのステージ

Scratchのステージ上に同じねこの絵を複数表示したいと思います。
それを実現する方法には、次のようなものがあります。
(1)スプライトを複製
(2)スタンプを押す
(3)クローンを作成
(4)その他
この記事では、上記の中の(3)のクローンを作成する方法を説明します。

2.ねこのスプライトのクローンを生成して見た目上の複製を実現



2.1.ねこの絵はスプライト

新規作成状態のねこの絵は、Scratchのスプライトと呼ばれるものの1つです。

ねこのスプライトは、組み込みのスプライトの中の1つであり、新規作成時に自動で読み込まれて表示されます。

組み込みの各スプライトは、プログラムを子供でも簡単に手早く作れるように、スプライトとして必要ないろいろな状態をある程度設定済みのデータです。

なお、この後プログラミングをしていく中で、ねこのスプライトを削除しても良いし、そのまま利用し続けても構いません。

2.2.スプライト

スプライトは、アニメで言うところのキャラクターと同じです。

アニメでキャラクターが着替えや変身をしたり、音(声など)を出したり、画面の中を移動したりするのと同じように、Scratchではスプライトの絵を変えて着替えや変身をさせたり、音(声など)を出させたり、ステージの中を移動させたり、動かしたりすることができます。

各スプライトは、コスチュームと呼ばれる1つ以上の絵の要素、音(または、サウンド)と呼ばれる0個以上の音の要素、スクリプトと呼ばれる0個以上のルーチン(コスチュームや音を制御する小さなプログラム)を持ちます。

2.3.スプライトのクローンの生成方法

スプライト●のクローンを生成するには、[制御]カテゴリーの[●のクローンを作る]ブロックを実行します。

[制御]カテゴリーの[●のクローンを作る]ブロック

ねこのスプライトのクローンを生成するには、[●のクローンを作る]ブロックの「●」をクリックし、ねこのスプライトのスプライト名[スプライト1](右下のスプライトリストのサムネイルを見るとスプライト名が確認できます)をクリックして選択したいところですが、ねこのスプライトのスクリプトエリアで[●のクローンを作る]ブロックの「●」をクリックすると、ねこのスプライト名は含まれていません。

今回のように、スクリプトエリアのスプライト(ねこ)自身を[●のクローンを作る]ブロックの「●」で選択したい場合は、「●」で[自分自身]をクリックして選択します。

なお、Scratchのエディターでプログラムを新規作成し始めたすぐの状態では、スプライトはねこのスプライトしか用意されていないので、[●のクローンを作る]ブロックの「●」には[自分自身]しかありません。

新規作成直後のねこのスプライトの[●のクローンを作る]ブロックの「●」

スプライトを追加すると、追加されたスプライトのスプライト名が「●」をクリックしたときの選択肢として並び、「●」で[自分自身]以外のスプライト名を選択すると、自分自身ではないスプライトのクローンを生成することができます。

ちょうちょとバナナのスプライトを追加した後の[●のクローンを作る]ブロックの「●」

ねこのスプライトのスクリプトエリアで、「●」を[自分自身]にした[●のクローンを作る]ブロックが実行(エディターのスクリプトエリアでクリックして実行することができます)されると、ねこのスプライトのクローンが1つできあがります。

「●」のスプライトのスクリプトエリアに[制御]カテゴリーの[クローンされたとき]ブロックで始まるスクリプトがない場合、[●のクローンを作る]ブロックが実行されると、元となるスプライトの現在の位置の真下の層に、元となるスプライトの現在の姿とまったく同じ姿のクローンが1つできあがります(だから、クローンができたかどうか、すぐにはわかりません)。

元となるスプライトとまったく同じ位置にクローンを作ってしまったとき、エディターのステージ上で、上にある元となるスプライトをドラッグ&ドロップして他の位置に移動し、下にできあがったクローンを確認することができます。

ねこのスプライトとそのクローン

なお、このときできたクローンの解像度は元のスプライトの解像度と同じで、はっきりした図です。
クローンはスタンプのように解像度が落ちることはありません(だから、見た目ではクローンとスプライトの違いはわかりません)。

3.スプライトとクローンの比較

3.1.クローンは実行中に作成

Scratchでは、スプライトは実行の前に作成し、スタンプとクローンは実行中に作成します。

3.2.[クローンされたとき]ブロックで始まるブロックだけがクローンを制御できる

クローンは、スプライトとかなり似ていますが、1つ1つのクローンを制御できるのは、そのクローンの元となるスプライトのスクリプトエリアにある[制御]カテゴリーの[クローンされたとき]ブロックで始まるスクリプトだけです。

[制御]カテゴリーの[クローンされたとき]ブロック

[クローンされたとき]ブロックで始まるスクリプトは、1つ1つのクローンが生成された直後に自動で起動し、そのとき生成したクローンに対して実行されます。

そのスクリプトの内容には特に制限はないので、コスチュームを変えたり、大きさや色を変えたり、移動したり、回転したり、音を出したりなど、普通にプログラミングできます(なお、[クローンされたとき]ブロックで始まるスクリプトの中の変数の扱いには注意が必要ですが、それに関しては、また別の機会に記事を投稿します)。

例えば、ねこのスプライトのクローンを生成した直後に、クローンを適当な位置に移動する、[クローンされたとき]ブロックで始まるスクリプトを作ります。
それを実現するために、[制御]カテゴリーの[クローンされたとき]ブロックの下に、[動き]カテゴリーの[●へ行く]ブロックをくっつけます([●へ行く]ブロックの「●」で[どこか]をクリックして選択)。

さらに、この例では、クローンは緑の旗をクリックしたときに10個生成することにします。
それを実現するために、[イベント]カテゴリーの[緑の旗が押されたとき]ブロックの下に、次の1~3を順にくっつけます。
1.ねこのスプライトを座標原点に位置付けるための[動き]カテゴリーの[x座標を〇、y座標を〇にする]ブロック(2つの〇に、半角で「0」を入力)
2.[制御]カテゴリーの[〇回繰り返す]ブロック
3.2の中に[●のクローンを作る]ブロック([●のクローンを作る]ブロックの「●」をクリックして[自分自身]を選択)

クローンを適当な位置に移動するスクリプトと、
緑の旗をクリックしてねこのスプライトのクローンを10個作るスクリプト

ステージの左上にある緑の旗のマークをクリックして実行してみます。
すると、適当な位置に、ねこのスプライトのクローンが10個できあがります。

が、先に1つクローンを作っていたので、ねこは、大元のねこのスプライトのねこが1匹、先に1つ作っていたクローンのねこが1匹、今、実行して出来上がったクローンのねこが10匹の計12匹が表示されていると思います。

実は、[クローンされたとき]ブロックで始まるスクリプトの実行が最後まで行われた後、そのスクリプトがそのクローンを削除して終わるようにプログラミングされていなければ、そのクローンを制御することができるのは、プログラムを完全に終了して他の全部のクローンと一緒に一度に消すことだけになります。

3.3.クローンの消し方

生成したクローンをプログラムの途中で明示的に消去するには、[制御]カテゴリーの[このクローンを削除する]ブロックで行います。

生成したクローンの内、[このクローンを削除する]ブロックで明示的に消去されなかったクローンは、プログラムが完全に終了したときに削除されます。

プログラムが完全に終了するとは、次の2つのどちらかの場合のことを指します。
1.実行を操作しているユーザーが、ステージ左上にある赤い八角形のボタン(強制終了ボタンとか、ストップボタンと呼ばれています)をクリックしたとき
2.[制御]カテゴリーの[(すべてを止める)]ブロックが実行されたとき

ストップボタンを押してプログラムを完全に終了してクローンを削除した図

その役割から、[このクローンを削除する]ブロックは、[クローンされたとき]ブロックを先頭に持つスクリプトの最後か、そのスクリプトの中の条件分岐の一連のブロックの中の最後のブロックとしてしか使用されません。

[制御]カテゴリーの[このクローンを削除する]ブロック

例えば、先ほど作った[クローンされたとき]ブロックで始まるスクリプトを追加修正し、クローンの上をマウスポインターが通ったとき、そのクローンが削除されるようにしてみます。
その修正は、現在のそのスクリプトの最後に、次の1~4のブロックを付けることで行います。
1.[制御]カテゴリーの[ずっと]ブロック
2.1の[ずっと]ブロックの内側に、[もしなら]ブロック
3.2の[もしなら]ブロックの六角形に、[調べる]カテゴリーの[●に触れた]ブロック(「●」で[マウスポインター]を選択)
4.2の[もしなら]ブロックの内側に、[制御]カテゴリーの[このクローンを削除する]ブロック

緑の旗をクリックして実行すると、ステージの真ん中にねこのスプライト1個が、また、ねこのスプライトと同じ姿のねこのスプライトのクローン10個が適当な位置にできあがります。
マウスを動かしてマウスポインターがステージのクローンの上を通ると、そのクローンが消えます。
もちろん、大元のねこのスプライトはマウスポインターが通っても消えません。
消さなかったクローンも、赤い八角形をクリックすると、プログラムが完全に終了するので、すべて消えます(もちろん、大元のねこのスプライトは消えません)。

[このクローンを削除する]ブロックを使ったプログラム例

このプログラムは、こちらのリンクから実行できます。

また、次のURL https://scratch.mit.edu/projects/579334986 は、Scratchのオンラインエディターでこのプログラムを表示します。

3.4.生成できるクローンの数には制限がある

プログラムの実行中、プログラム全体で同時に存在できるクローンの数は300個までという制限があります。

例えば、雪の1つぶを1つのスプライトとして用意し、そのクローンをたくさん生成して、ステージのランダムな位置から下に移動して表示するプログラムを作ることを考えます。

このとき、雪をたくさん降らせたくても、同時に300つぶ以上のクローンが生成中にならないよう、制御します。
例えば、[クローンされたとき]ブロックで始まるスクリプトの中で、あるy座標以下に移動した雪のクローンは削除するとか、1つ1つのクローンの落下時間を調整するとか、一定時間内の生成個数を調整するなどの対応が考えられます。

ちなみに、雪を降らせるプログラムの雪の1つぶ1つぶをスプライトで用意しようとすると、用意が大変な上に、実行するプログラムのファイルのサイズが非常に大きくなります。
クローンは、スプライトの用意も簡単で(なぜなら、元となるスプライト1つの定義で済むので)、実行プログラムのファイルのサイズも大きくならず、雪や、シューティングゲームの弾などのようなものの振る舞いをプログラミングするのに向いている機能です。

ちなみに、実行中のある瞬間にすでに300個クローンが生成中で、さらにクローンを生成しようとすると、301個目からの生成を要求するブロックの実行は無視された状態で実行が進みます。
このとき、経験上だけの話ですが、クラッシュはしないようです(クラッシュしないという保証はありませんが、何回か実際にやってみて、まだ、クラッシュするのを見たことはありません)。
301個目以降の生成は、クローンが明示的に1つ以上削除されるまで無視され、その後クローンの削除のブロックの実行があり、そのまた後にクローンを生成するブロックが再び実行されると、その瞬間に生きているクローンの数が300個に達していなければ、またクローンが生成されます。

子どもたちが使うプログラミング言語なので、プログラム言語的にエラーであっても、クラッシュなど、プログラムを止めてしまうような動きにならないような作りにしているようです。

4.おまけ:スプライトとクローンとスタンプ

Scratchのスプライトは動的に生成することはできませんが、スプライトはスクリプトを好きなだけ作れる自由度の高いScratchの基本となるデータです。
一方、Scratchのクローンは、スプライトのデータを元に動的に生成(すなわち、実行中に生成)するデータで、機能が一部制限されたスプライトのようなデータです。

クローンのメリットは、スプライトとほぼ同じデータを、実行中に必要なときに必要な数(制限はありますが)だけ生成して利用できるところです。

クローンとスタンプはまったくの別ものです。
クローンは[クローンされたとき]ブロックで始まるスクリプトによって、スプライトと同様に表示位置や形、大きさなどいろいろなことを制御できるデータです。
一方、スタンプは一枚の層に線と共に描かれる絵の一部なので、そのスタンプの絵だけを変えるとか動かすといったことはできません。
また、スタンプは絵なので、300個でも400個でも好きなだけ描き込むことができますが(スタンプをたくさん押しても、一枚の層が絵的に変化するだけ)、クローンは、プログラムの実行中のある瞬間に生成されている個数が300個以下でなければなりません。

コメント