Scratch 3.0向けに自作オリジナルブロックを開発することができます。
Scratch 3.0を利用しているたくさんの人に自分のブロックを使ってもらう事ができます。
もちろんすでに通常のScratch 3.0にも「ブロック定義」というものがあるのですが、もっと自由度が高い、もしくは独自デバイスと連携するような少しギークなことをしようとするなら、オリジナルブロックを開発するとよいです。
開発方法・環境準備方法は前の記事で述べましたので、参照してください。
さて、本題ですが、開発できるブロックのタイプがいくつかあります。
自分が作りたい中身に合わせて、ブロックのタイプを選ぶと良いと思います。
なぜならScratch 3.0はブロックのタイプで見た目や触り心地が変わり、大きくユーザエクスペリエンスが変わるからです。
例えば、COMMAND
ブロックを使用すると、1行のコマンドを実行させるような処理に向いています。
他にも色々なタイプがありますので、さっそく見ていきましょう。
目次:全タイプ(★が一つのものは詳細は今回省きます)
-
COMMAND
タイプ ★★★★ 超基本 -
REPORTER
タイプ ★★★ 基本 -
BOOLEAN
タイプ ★★ ちょっと上級 -
HAT
タイプ ★★ ちょっと上級 -
EVENT
タイプ ★ 上級 -
CONDITIONAL
タイプ ★上級 -
LOOP
タイプ ★上級 -
BUTTON
タイプ ★上級
1) COMMAND
タイプのブロック
COMMAND
タイプは一番簡単でよく使われるブロックのタイプです。
COMMAND
は1つの関数処理を実行します。
どんなふうに使うかと言うと、こんなふうに別のブロックを上下につないで使います。
ブロックは上から下に向けて順番に実行されます。ですから、このCOMMAND
ブロックは上のブロックの処理が終わったあとに実行されます。
では、開発する場合にはどうするかですが、まずはブロックの定義を書きます。
COMMAND
ブロックの定義はこのように書きます。
{}
にくくられている範囲が定義です。blockType
はBlockType.COMMAND
とかく必要があります。
text
には、ブロックの顔にもなるところに表示したい文字列で、好きに記載します。ただし、一つだけルールがあり、[●●]
と書くとその●●は入力を受け付ける特別な場所と認識されます。
opcode
は後で説明するこのブロックの大事な処理の実装の名前です。
では次に、ブロックの処理を実装します。
先ほどopcode
に書いたのと同じ名前の関数の中に、ブロックの処理を書いていきます。
args
という引数を受け取ることができます。args
の下には、ブロック定義のtext
で指定した入力の名前の変数が入っています。
上の例では、一番簡単な処理として、TEXT
という値を入力として受け取って、それをログ(デバッグ画面で表示できる)に書き出す、ということをしています。ここは自由に自分の処理を書いてください。
2) REPORTER
タイプのブロック
REPORTER
も基本的なブロックです。
REPORTER
は、値を作ることに特化しています。値というと、String
型やInteger
型などさまざまな値を扱うことができます。ただし、基本的にはString
で扱われると考えておいたほうがよいかもしれません。
REPORTER
が出す値は、ほかのブロックに入れることができます。
COMMAND
ブロックの入力として入れることもできます。また、REPORTER
ブロックの入力にも入れることができるので、こんな感じに何段にも入れ子を作れたりもします。
では作ってみたいと思います。
REPORTER
ブロックの定義は、このようになります。
blockType
はBlockType.REPORTER
になります。それ以外はだいたいCOMMAND
と同じです。
では、ブロックの実装はどうなるでしょうか。opcode
に指定された名前の関数はこうなります。
COMMAND
ブロックと違い、REPORTER
ブロックは**return
文を使って値を最後に返しています**。
この値が、ブロックで作った値となります。
このブロックではArgument TEXT is (ここにTEXTという入力の文字列を入れる)
という文章(String
型)を作っています。
3) BOOLEAN
タイプのブロック
BOOLEAN
タイプはREPORTER
の特殊なバージョンと言えます。
boolean
という、以下の2つしかバリエーションがない値だけを扱うという特殊なバージョンです。
-
true
(真[しん]といい、「結果が正しい」ことを表します)か -
false
(偽[ぎ]といい、「結果が間違っている」ことを表します)か
すこしだけトリッキーな使い方ができます。
というのも、ほかのブロックに入れるときにいくつかのパターンがあるのです。
簡単な使い方は、BOOLEAN
を入力として受け付けるほかのブロックにくっつける場合です。
こういうブロックは最初から入力部分が<=>
みたいな形になっているので、つながるなーと分かります。
つないでみると、見た目どおり確かにつながります。
次ですが、ほかのブロックにもくっつけることができます。それは、String
などほかの値を受け取るようなブロックにくっつける場合です。
下の例を見ると、入力の形が○
のようになっていてつながらさそうなのですが、下のようにつながってしまいます。これはこれで正しいのです(これで処理が間違わないようにCast
をしなければなりませんが)
では、ブロックを作ってみます。
ブロックの定義はこうなります。ほとんどREPORTER
と同じです。
大事なのは実装です。
ちゃんと**boolean
つまりtrue
かfalse
を返さなければいけません**。
4) HAT
タイプのブロック
HAT
タイプはイベント(なにか変わったことが起きたこと)に気づくために必要なブロックです。
例えば、上の絵のように別のsend
ブロックから送られたイベントを受け取って、処理を始める、といったときに使います。
このブロックには複雑な処理を書くわけではなくて、何が変わったかについてを指定してあげる必要があります。
さっそくブロックの定義はこうなります。この基本的な内容もCOMMAND
と同じです。
このブロックの実装はこうなります。
HAT
の処理はhat1
という関数に書いてあります。
内容は、send1
という別のブロックで変更した値changed
に気づく、という処理を書いています。changed
が変わったときにreturn rtn
のところでtrue
の値を返して終わります。
大事なのは、hat1
という関数は常に呼び続けられて、その値が変わったときに次のブロックを実行していくということです。しかも少し癖があって、false
からtrue
になったときだけ、イベントとして検知することができます。
なので、下の絵のようにhat1
が変わった場合には、2回イベントが検知されることになります。
ここで少し困ったことになる場合があります。
例えばキーを押し続けたりしてScratchキャットを右に動かし続けるようなプログラムがありますよね。こういうふうに、イベントを連続で検知するときに失敗したりするのです。
なぜかというと、true
を返し続けてしまうからです。
true
を連続で返すと、Scratchは「値がfalse
からtrue
になったわけではない」と判断してイベント検知してくれません。したがって、上の絵のようにtrue
がずっと出ているのに、イベント検知は1回になってしまいます。
じゃあ、どうするかというと、たとえばこんなふうに必ず一回false
に戻るようにhat1
を実装変更することで対応できます。
結論:ブロックタイプをうまく選ぼう
さて、4つのブロックタイプ、COMMAND
、REPORTER
、BOOLEAN
、HAT
を使ってブロックが作れるようになりました。目的に応じてうまくタイプを選ぶと、とても使いやすいブロックができると思います。これで、あなたのオリジナルブロックが将来、みんなに使ってもらうようになる日が来るかもしれません。