Scratchで使える意外なテクニックいろいろ

~~**2020/2/26追記**・好評を頂いたので第二弾を公開しました!是非ご覧下さい。~~
**2021/2/1追記**・第二弾の記事の内容をこちらに統合しました。

Scratchで使える意外なテクニックを自分なりにまとめてみました。
中には「知ってて当然だろ」と思うものもあるかもしれませんが、温かい目で見守ってあげてください。
なお、この記事はScratchの使い方をある程度理解している方が対象です。
#真偽ブロックを数値として扱う
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/9eaefe55-d1c7-5946-dac3-3624689e36c8.png)
このような六角形をしているブロックは真偽ブロックと呼ばれ、True(真)かFalse(偽)を返す物です。
通常は同じ六角形をしているスペースにはめますが、文字列を入力する部分にもこれらのブロックを入れることができます。
また、数値として扱う場合、Trueは1、Falseは0として扱われます。
例えば、下の二つのプログラムは同じ動きをします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/3eeadb90-bc98-df6e-a8ed-24691376ca9c.png)
#ミリ秒単位で現在の時刻を取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/39b063f4-3683-43d5-acb3-9ab1e2abdcc0.png)
このブロックで取得できる時刻の最小の単位は秒ですが、2000年からの日数というブロックはミリ秒単位で時刻を取得できるので、それを利用することができます。
ミリ秒をふくむ現在の秒は次のようにして求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/c6efe6d3-4175-4a8d-85e5-048799e20a1c.png)
#クローンにそれぞれ違う変数を持たせる
「このスプライトのみ」にチェックを入れた変数を使うと、クローン毎にそれぞれ違った値を持たせることができます。
以下のプログラムを実行すると、それが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/e00decaa-221a-9d0e-61d0-f8d5cf91f674.png)
また、クローン毎の値は「クローンされたとき」の下に変数を操作するブロックを付けると変えられます。
#クローンにメッセージを受け取らせる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/5ab1d523-bb54-9a7c-7406-e6349f8371d2.png)
このブロックは、クローンに対しても使うことができます。
スプライトが作成した全てのクローンに対して一斉に同じ操作をしたいときに便利です。
##受け取らせたくないとき
逆にクローンにメッセージを受け取って欲しくないときは、先ほどの「このスプライトのみ」にチェックを入れた変数を利用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/3762d569-c9bf-af48-514e-317a469a5439.png)
#乱数で小数を返す
乱数ブロックの二つの入力欄のどれかに少数を入力すると少数の乱数を返してくれます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/b5288268-2ae3-379e-1b02-e540d81f57d1.png)

#ペンの色の特殊な指定
ペンの色はカラーピッカーで指定できますが、RGBの値や16進数カラーコードで指定することも出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/d685c752-c7eb-7f58-b5fe-39b53d7473a0.png)
(真ん中の三つの変数は分かりやすくするために作成しています)
##アルファチャンネルの指定
下のようにするとアルファチャンネル(透明度)の指定も出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/3b28850e-7307-e617-6521-a859f6301512.png)

#任意の桁で四捨五入
「()を四捨五入」ブロックは小数点以下を四捨五入した値を返しますが、四捨五入する前の値にx10やx100などをして小数点の位置をずらすと、四捨五入する桁を操作できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/9f02e598-e22e-350a-1a24-8584ac9ec6ce.png)
#画面を再描画せずに実行する定義ブロック
(提供:[hota1024](https://scratch.mit.edu/users/hota1024/)さん)
定義ブロックを作る際のオプションとして「画面を再描画せずに実行する」という物があります。
これにチェックを入れると、定義された処理が一瞬で行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/8ffafa93-4bba-ca6e-ef88-c75d8db48a05.png)
ただし、この定義ブロックに「待つ」系のブロックや、「ずっと」やそれと同じ動きのブロックを入れてはいけません。
#画面より大きいスプライトを作る
(提供:[ikamesi](https://scratch.mit.edu/users/ikamesi/)さん、[robo_24](https://scratch.mit.edu/users/robo_24)さん)
スプライトエディターをベクターモードにすると、画面外にオブジェクトを配置できるようになります。
また、画面外に見えない点などを置いておくと、スプライトの画面端へ動ける範囲が広がります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/b7dbb3de-9678-0dff-2631-91414d28d87b.png)
#スタンプの仕様
(提供:[ws17042001](https://scratch.mit.edu/users/ws17042001/)さん)
ビットマップモードで書いた大きさが100%のスプライトはスタンプをしても画質が変わりませんが、大きくすると画質が落ちてしまいます。
また、ベクターモードで描かれたスプライトはビットマップの状態でスタンプされてしまうので注意が必要です。
#接触判定をするスプライトを変える
(提供:[robo_24](https://scratch.mit.edu/users/robo_24)さん)
「()に触れた」ブロックは、スプライトの名前が入る部分に値ブロックを埋め込められます。
例えば、「Enemy_1」、「Enemy_2」…の様な名前のスプライトを作ったとすると、以下の様にして接触判定をするスプライトを変えられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/50db5d62-de38-3c29-b704-a1608d32771c.png)
#擬似的なグリッド上にのみスプライトを置く
以下のようにするとできます。値を小さくすると間隔を狭められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/74038fef-b4a6-41bf-48f4-0970ff96371c.png)
#三角関数を使って円を描く
Scratchには演算ブロックとして「()のsin」と「()のcos」が用意されています。
この二つのブロックを利用するときれいな円を描くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/1bc77237-5407-3892-5d14-cf88e3bccf86.png)
#Makey Makey拡張機能でコマンドを作る
Scratchで使える拡張機能の中にMakey Makeyという物があります。
そのなかにある「()が順番に押されたとき」ブロックは、文字列連結ブロックをはめることで、指定した順番でキーを押すと動くブロックを作る事ができます。
矢印キーはそれぞれ「up」(上)、「down」(下)、「right」(右)、「left」(左)で指定できます。
キーとキーの間には空白を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/5212401a-f398-beff-01b1-b6464299b80a.png)
#言語コードで言語を指定
[Wikipedia](https://ja.wikipedia.org/wiki/ISO_639-1コード一覧)に載っている言語コードの一部は、翻訳や合成音声での言語の指定に使えます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/ccde51be-51c5-1934-81ba-c54fb698f491.png)
例えば、「en」だと英語、「ja」だと日本語になります。
#16進数・8進数・2進数を扱う
(提供・[mochimochiking](https://scratch.mit.edu/users/mochimochiking/)さん、[watashida](https://scratch.mit.edu/users/watashida/)さん)
文字列を連結するブロック、「()と()」は左に0x、0o、0bを入れると、それぞれ16進数、8進数、2進数として扱うことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/2a19e07c-acda-a2d1-9a2c-871c9ee2e237.png)
#特殊なキーの押された判定
(提供・[YY04](https://scratch.mit.edu/users/YY04/)さん)
画像のようにすることで、Enterキーや記号の押された判定が出来ます。記号は、!"#$%&'()`@{[+;*:}],>.?/_\の26個が使えるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/50328fe0-8292-dc07-646b-ad3ed4a2343e.png)
#xのn乗、xのn乗根を求める
画像のようにするとできます。
xに27が、nに3が代入されているとき、この場合では上のブロックでは27の3乗である19683[^1]、下のブロックでは27の三乗根である3[^1]が返されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/267dd7d8-9daa-222a-9b31-6b7245452f19.png)
#任意の二点間の距離を求める
一つ別にスプライトを用意して任意の場所に動かし、「(スプライト)までの距離」で調べる方法が簡単ですが、三平方の定理を使って求めることもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/8f9b22a7-8542-e4a2-8c6e-45ba427f52df.png)
#「()と聞いて待つ」をキャンセル
「()と聞いて待つ」ブロックを使うと出せる入力欄は、一度出すとチェックボタンかEnterを押すまで消えません。
しかし、「スプライトの他のスクリプトを止める」ブロックを使うと、強制的に消すことができます。
ただし、この方法を使うとスプライト内の他に動いているスプライトがまとめて止まってしまうので注意が必要です。
#x座標とy座標を同時に任意の距離動かす
x座標とy座標を同時に任意の距離動かすブロックは存在しませんが、以下の様にして代用できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/e43ebeb6-9c84-7296-735c-e4e8008c4d85.png)
これは、ペンを使ったプロジェクトに活用できます。
#値が整数であるか判定
整数は四捨五入しても値が変わらないのを利用して、値が整数であるかどうかを確認できます。
また、「()を(1)で割ったあまり」を使えば、あまりが0であるかの判定で確認できます。
(後者の方が可読性は高いものと思われます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/ca10020c-eea8-9218-46a8-70f5c195d509.png)
ちなみに、後者のブロックを上手く使えば、偶数奇数の判定もできます。
#gif画像をコスチュームとして読み込む
コスチュームエディタの「コスチュームをアップロード」で、gif画像を選択すると、その画像の全てのコマが別々のコスチュームとして読み込まれます。
スプライトの動きだけでは表現できないエフェクトなどを付けたい時に便利です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/dc81b95d-9895-aa11-6f13-caf18e30f307.png)

#クローン内で行われている処理のみを止める
「スプライトの他のスクリプトを止める」ブロックは、「クローンされたとき」の下に付けて動かすと、そのクローン内で動いている他のスクリプトのみを止めてくれます。
逆に、クローン以外の部分のスクリプトは停止しません。
#最後のコスチュームにする
「コスチュームを[]にする」のコスチューム名の部分に変数などをはめて「0」を指定すると最後のコスチュームに変えることが出来ます。
#クローンを全て消して本体のみ動かす
(提供:[sky_77](https://scratch.mit.edu/users/sky_77)さん)
下のようなスクリプトを作ると、メッセージを受け取ったときに、そのスプライトのクローンが全て消え本体のみ下のプログラムを実行します。
「もし<>なら」の中は、常にTrueを返す条件ブロックが入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/83520b30-c453-fd8d-dd11-77ef71286fd7.png)
#音楽の一拍当たりの時間を求める
60をBPM(一分当たりの拍数)で割ると求められます。2拍や3拍の時間を求めたい時は、結果に2や3をかけてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/32935cec-5ce1-b1b9-2968-a5b1160a04fd.png)

#フレームの上限を無視してリズムを刻む
画面を再描写するような処理を行っている間はプログラムの実行感覚がが30/秒に制限されます。そのため下のような処理は、音を鳴らす時間が正確にならず、音ずれが生じてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/afe8d324-a865-f4ad-f63f-782e09f2768f.png)
これを解消するにはタイマーを使います。
タイマーは実行感覚に制限があっても正確に時間を計り続けるので、下のようなプログラムでリズムを合わせることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/4033edae-9792-6b68-6a06-41805d7943ab.png)

#定義されたプログラムを中断する
(提供:[fine316](https://scratch.mit.edu/users/fine316/)さん)
定義ブロック内で「このスクリプトを止める」が実行されるとその定義内の処理がすべて終了されます。
逆に、定義を使ってスクリプトを止めることはできないので注意してください。

#複数のファイルを一度に取り込む
音やコスチュームをプロジェクトに取り込むときに、複数のファイルを選択することで、それらのファイルを一度に取り込むことができます。[^2]

#限界を超えてスプライトを大きくする
大きさが小さいコスチュームに切り替えて「大きさを()にする」などで大きさを大きくし、コスチュームを戻すと、限界を超えてサイズが大きくなった状態が維持されます。
ただし、**あまり大きくしすぎるとステージ上のスプライトを移動しようとしたときに動作が止まる可能性があります**。

#他のスプライトのローカル変数のデータを取得する
調べるカテゴリにある、次のブロックで取得できます。
ブロックパレットでは、((ステージ v) の [背景# v])として表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/444993/9f0f2bed-27ec-2a15-d67e-c70f984a768e.png)

#同じ色を一斉に塗り替える
ビットマップモードのコスチュームエディターでは、Shiftを押しながら塗りつぶしをすることで、同じ色を持つ他の場所をすべて指定した色に塗り替えることができます。
https://twitter.com/scratch/status/1237074233236295680

#図形の複数選択
ベクターモードのコスチュームエディターでは、Shiftキーを押しながら図形を選択することで、同時に複数の図形を選択の対象にすることができます。
また、その選択した図形の塗りつぶしの色などを一度に変えることもできます。



#最後に
この記事はあくまでも僕の知っているテクニックや皆さんから提供されたテクニックを集めた物です。
もし「こんなテクニックもあるよ」と言った物がありましたら、是非コメント欄でお寄せ下さい!
[^1]: 実際には、わずかに誤差が生じます。これを改善するには、切り捨てや、四捨五入を活用する必要があります。
[^2]: WindowsやMac、Raspberry PiのRaspbian上で使えるそうですが、一部のOSでは使えない可能性があります。