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を使ってブロックが作れるようになりました。目的に応じてうまくタイプを選ぶと、とても使いやすいブロックができると思います。これで、あなたのオリジナルブロックが将来、みんなに使ってもらうようになる日が来るかもしれません。



















