子供向けプログラミング言語 Scratch(スクラッチ)で大量に同じ図を表示するときは、スプライトをコピーして図を表示する方法よりも、クローンの機能やスタンプの機能を使用する方が、楽にプログラミングでき、かつ、性能の面から見ても効率の良いものになります。
この記事では、クローンの詳細と、スプライトとクローンとスタンプの違いなどを説明します。
(この記事は、2021年12月28日にScratch3.0 用の内容に書き換えました)
【目次】
1.はじめに
2.クローンの生成
2.1.自分自身のクローンの生成
2.2.他のスプライトのクローンの生成
2.3.クローンの生成時に実行されるスクリプト
3.クローンの削除
4.クローンが描いた線とスタンプ
4.1.Scratchのスタンプ
4.2.スプライトが描いた線とスタンプ/クローンが描いた線とスタンプ
5.クローンの制限
6.クローンとスタンプの違い
7.まとめ
1.はじめに
シューティングゲームのようなプログラムでは、同じ形の弾や的の図を、大量に表示します。
特に弾の図は、場合によっては的の図も、表示するだけでなく、色や形、大きさや位置に変化を付けたい場合があります。
子供向けプログラミング言語 Scratch(スクラッチ)では、変化を付けたい図は、スプライトと呼ばれるものとして作成し、使用します。
スプライトの作成方法は、こちらのブログ記事「動かす絵を簡単に用意する方法」をご覧ください。
同じ図1つ1つをスプライトで持つ場合は、あらかじめ、元となる1つのスプライトを作り、それを必要数コピーして、それぞれ個別のスプライトとして用意します。
スプライトを用意する作業は、1つ1つ手で行う作業です。
例えば、同じ図100個をスプライトで用意して表示する場合、1つのスプライトを用意して元とし、1つ1つ99回手作業でコピーすることにより、99個のスプライトを用意することになります。
また、スプライトは、実行時に必要な数だけ随時生成できる仕様にはなっていないため、あらかじめ最低必要と思われる数以上の特定の数のスプライトを用意しておく必要があります。
このような場合、万が一のために、多めの個数を用意しますが、多めにスプライトを用意すれば、その分メモリをくうので、効率を考えると、使わない可能性が高いスプライトでメモリの領域をたくさん使用してしまうのは避けたいという気持ちもあります。
そのため、弾や的のような大量に表示したい図があるときは、1つのスプライトを元にしてコピーする以外の方法である、クローンやスタンプの機能を使用します。
必要最小限の要素の用意で済ませられれば、実行時のメモリの使用量を抑えられ、効率の良いプロジェクトになります。
2.クローンの生成
Scratchのクローンとは、そのプロジェクト内で定義されたスプライトと同じ属性を持つもので、プロジェクトの実行の途中の任意のタイミングで、[制御]グループの[□のクローンを作る]ブロックによって、スプライトの情報を利用して一時的に生成されるものです。
クローンは、生成時に自動的に起動されるただ1つの特別なスクリプトで制御することが可能です。
ただし、クローンの制御は、生成時に自動で起動されるただ一つの特別なスクリプトの実行の終了をもって、以降不可能になります。
以下、2.1.と2.2.のどちらかで作ったブロックが実行されたとき、クローンが生成されます。
2.1.自分自身のクローンの生成
あるスプライトのスクリプトエリアで、そのスプライト自身のクローンを作るには、[制御]グループの[□のクローンを作る]ブロックを使用し、そのブロックの「□」で「自分自身」を選択します。
2.2.他のスプライトのクローンの生成
あるスプライトのスクリプトエリアで、そのスプライト以外のスプライトのクローンを作るには、[制御]グループの[□のクローンを作る]ブロックを使用し、そのブロックの「□」で「自分自身」以外の、クローンを作成したいスプライトの名称を選択します。
次に説明する2.3.のスクリプトを作らないまま、2.1.か2.2.のブロックのみが実行された場合、クローンは対象となるスプライトの現在の色、形、大きさ、位置などの見かけ上の値すべてをそのまま継承して生成され、このプロジェクトが終了するまで、ステージ上にそのまま存在します。
2.3.クローンの生成時に実行されるスクリプト
クローン自身の色や形、大きさ、位置を変えることは、クローンの生成時にクローンに対して自動的に1度だけ実行される、ただ1つの特別なスクリプトの中でのみ可能です。
この、クローンの生成時に実行されるスクリプトは、[制御]グループの[クローンされたとき] ブロック (ハットブロック)を先頭につけたスクリプトです。
[制御]グループの[クローンされたとき] ブロックを先頭につけたスクリプトを作るとき、このスプライトで使えるすべてのブロックを使うことができます。
また、[制御]グループの[クローンされたとき] ブロックを先頭につけたスクリプトを作るとき、このスプライトのみ用の変数を作ると、その変数はクローン毎に別々の値を保持するものとなります。
[制御]グループの[クローンされたとき] ブロックを先頭につけたスクリプトを作っていない場合、または、[制御]グループの[クローンされたとき] ブロックを先頭につけたスクリプトの実行が終った場合、もはや、生成されたクローンを操作できる方法はありません。
3.クローンの削除
新しくプロジェクトを実行し直すと、または、ステージ右上の赤い八角形で強制終了すると、直前の実行で生成されたクローンはステージ上から自動的に消えます。
[制御]グループの[このクローンを削除する] ブロックが実行されると、クローンが削除され、ステージ上のクローンも消えます。
考えていただければわかるように、このキャップブロックである[このクローンを削除する] ブロックは、その役割の性質上、[制御]グループの[クローンされたとき] ブロックを先頭につけたスクリプトの、処理の流れの最後か、処理の流れがいくつか枝分かれした中の処理の流れの最後にしか位置することができません。
[制御]グループの[クローンされたとき] ブロックが先頭にあるスクリプトの中で、[見た目]グループの[隠す] ブロックが実行された場合、見かけ上ステージ上のクローンは消えますが、もちろん、この場合は、この後同じスクリプト内で[見た目]グループの[表示する] ブロックが実行されれば、クローンがステージ上に再表示されるのは、言うまでもありません。
4.クローンが描いた線とスタンプ
4.1.Scratchのスタンプ
Scratchのスタンプは、[ペン]グループの[スタンプ]ブロックによって、そのスプライトの現在の色や形、大きさ、位置で、そのままスプライトの図をステージ上にスタンプのように貼り付ける機能です。
[スタンプ]ブロックは、[ペン]グループのブロックの1つですが、他のペンの機能と違ってペンの上げ下ろしとは無関係で、いつでもこのブロックを実行すれば、その時点のスプライトの色や形、大きさ、位置で、スプライトの図をステージ上にスタンプのように貼り付けます。
[ペン]カテゴリーは、Scratch2.0までは基本機能のカテゴリーの1つだったため、Scratchの起動直後にブロックパレットに表示されるカテゴリーの1つでした。
一方、Scratch3.0から[ペン]カテゴリーは拡張機能のカテゴリーに分類されたため、[ペン]カテゴリーのブロックを使用したいときは、その前に、エディター左下にある[拡張機能を追加]ボタンをクリックして
[拡張機能を追加]ページを表示し、[ペン]カテゴリーのサムネイルをクリックして、
[ペン]カテゴリーのブロックをブロックパレットに表示してから利用します。
4.2.スプライトが描いた線とスタンプ/クローンが描いた線とスタンプ
スプライトが描いた線とスタンプも、クローンが描いた線とスタンプも、同じふるまいをします。
通常のスプライトのスクリプトで、[ペン]グループのブロックで描いた線や押したスタンプの図は、プロジェクトの実行が終わり次の実行が始まってもステージ上に残ったままです。
線やスタンプの図は、[ペン]グループの[消す] ブロックを実行して始めてステージ上から消えます。
[制御]グループの[クローンされたとき] ブロックを先頭につけたスクリプトで、[ペン]グループのブロックで描いた線や押したスタンプの図でも、通常のスプライトのスクリプトで描いた図と同様のふるまいになります。
5.クローンの制限
Scratch2.0では、クローンは最大300個まで作成することができ、それ以上生成した場合、プロジェクトはクラッシュする恐れがあると、Scratch Wikiに書いてあります。
ここで、プログラムのクラッシュとは、データが壊れたり、コンピューターが故障したりするような状況のことをいいます。
6.クローンとスタンプの違い
クローンは、クローンの元となるスプライトと同様に、その生成時に起動されるスクリプト内であれば、その属性である色や形、大きさ、位置などすべての属性を何度も変えることができます。
また、クローンは、その生成時に起動されるスクリプトの中でなら、スプライトと同様に扱えるので、表示非表示を、[見た目]グループの[表示する] ブロックと[隠す] ブロックで制御できます。
また、クローンは、プロジェクトが(赤い八角形のボタンのクリックにより)強制終了されたとき、または、次のプロジェクトの実行が始まったとき、直前のプロジェクトの実行でステージ上に表示されていたものが自動的に消えてなくなります。
一方、スタンプは、ある時点でのスプライトやクローンの色や形、大きさ、位置などすべての見た目の属性をそのままステージに上に貼り付けたものなので、一度貼り付けた図柄は変えることができません。
また、ある時点までに書き溜められたステージ上のすべてのスタンプと線を全部一度に消すことは可能です([ペン]グループの[消す] ブロックを使用)が、1つのスタンプだけなど、一部のみを消すことはできません。
また、スタンプと線で描かれた図は、プロジェクトが終了しても、さらに、次のプロジェクトの実行が始まっても、直前までのプロジェクトが描いたものがそのままステージ上に残り表示され続けます。
これは、[ペン]グループの[消す] ブロックを実行することでのみ、消すことができます。
最後に、一般のスプライトとクローン、および、スタンプと線の表示される層について、簡単に説明します。
プロジェクトでプログラミングして作っていく絵が表示されるScratchのステージは、見た目は一枚の紙のようですが、プログラミング上は、以下の決まりに従って、層を重ねて一枚の絵を作っています。
まず、一番底の層が、背景です。
次の層が、[ペン]グループによって描かれる、スタンプと線の層です。
下から3番目以上の層が、スプライトやクローンの図の層です。
スプライトやクローンは、その1つ1つが層を成し、スプライトやクローンの図柄が重なったときは、描いた順に下から上に層を形成します。
この層の順番には、次の3つの決まりがあります。
・背景の層はいつも必ず一番下(上にする方法がない)
・スタンプと線の層は、必ず背景の層の上で、すべてのスプライトとクローンの層の下(層を移動する方法がない)
・すべてのスプライトとクローンの層は、スタンプと線の層の上で、スプライトやクローンの層の重なりの順序は、[見た目]グループの[前に出す] ブロックと[〇層下げる] ブロックで変えることができる
7.まとめ
・クローンの生成は[制御]グループの[□のクローンを作る]ブロックで行う
・クローンは、生成時に自動的に起動されるスクリプト内で自由に色や形、大きさ、位置を変えることができる
・クローンの生成時に自動的に起動されるスクリプトは、[制御]グループの[クローンされたとき] ブロック (ハットブロック)を先頭につけて作成する
・クローンは、[制御]グループの[クローンされたとき] ブロックを先頭につけたスクリプトの処理の流れの最後にある[制御]グループの[このクローンを削除する] ブロックで削除することができる
・クローンは、明示的に[制御]グループの[このクローンを削除する] ブロックで削除しない場合、赤い八角形のクリックでの強制終了か、次のプロジェクトの実行直後に、自動で削除される
・クローンは、Scratch3.0では、最大300個まで作成することができ、それ以上生成した場合、プロジェクトがクラッシュする恐れがある
・クローンは、ステージ上ではスプライトと同じ層に位置する
・スプライトのスタンプ押すには、[ペン]カテゴリーの[スタンプ]ブロックを使う
・[ペン]カテゴリーは、Scratch3.0から拡張機能のカテゴリーになったため、エディター起動直後にはブロックパレットに表示されていない
・[ペン]カテゴリーのブロックを使うには、エディター左下の[拡張機能を追加]ボタンをクリックし、表示された[拡張機能を追加]ページの[ペン]カテゴリーのサムネイルをクリックして、エディターのブロックパレットに[ペン]カテゴリーのブロックを追加するところから始める
・スタンプと[ペン]カテゴリーの線を描く機能で描いた線は、背景の層と、全部のスプライトとクローンが層として重なっている中の一番下になっているスプライトかクローンの層との間に挟まれた1枚の層に描き込まれるもの
コメント