Help us understand the problem. What is going on with this article?

[Scratch 3.0] 自作ブロックで使えるブロックタイプ4種類とサンプル

image.png

元記事

Scratch 3.0向けに自作オリジナルブロックを開発することができます。
Scratch 3.0を利用しているたくさんの人に自分のブロックを使ってもらう事ができます。
もちろんすでに通常のScratch 3.0にも「ブロック定義」というものがあるのですが、もっと自由度が高い、もしくは独自デバイスと連携するような少しギークなことをしようとするなら、オリジナルブロックを開発するとよいです。

開発方法・環境準備方法は前の記事で述べましたので、参照してください。

さて、本題ですが、開発できるブロックのタイプがいくつかあります

自分が作りたい中身に合わせて、ブロックのタイプを選ぶと良いと思います。
なぜならScratch 3.0はブロックのタイプで見た目や触り心地が変わり、大きくユーザエクスペリエンスが変わるからです。

例えば、COMMANDブロックを使用すると、1行のコマンドを実行させるような処理に向いています。

他にも色々なタイプがありますので、さっそく見ていきましょう。

目次:全タイプ(★が一つのものは詳細は今回省きます)

  1. COMMANDタイプ ★★★★ 超基本
  2. REPORTERタイプ ★★★ 基本
  3. BOOLEANタイプ ★★ ちょっと上級
  4. HATタイプ ★★ ちょっと上級
  5. EVENTタイプ ★ 上級
  6. CONDITIONALタイプ ★上級
  7. LOOPタイプ ★上級
  8. BUTTONタイプ ★上級

1) COMMANDタイプのブロック

COMMANDタイプは一番簡単でよく使われるブロックのタイプです。

COMMANDは1つの関数処理を実行します。

image.png

どんなふうに使うかと言うと、こんなふうに別のブロックを上下につないで使います。

ブロックは上から下に向けて順番に実行されます。ですから、このCOMMANDブロックは上のブロックの処理が終わったあとに実行されます。

image.png

では、開発する場合にはどうするかですが、まずはブロックの定義を書きます。
COMMANDブロックの定義はこのように書きます。

image.png

{}にくくられている範囲が定義です。blockTypeBlockType.COMMANDとかく必要があります。

textには、ブロックの顔にもなるところに表示したい文字列で、好きに記載します。ただし、一つだけルールがあり、[●●]と書くとその●●は入力を受け付ける特別な場所と認識されます。

opcodeは後で説明するこのブロックの大事な処理の実装の名前です。

では次に、ブロックの処理を実装します。
先ほどopcodeに書いたのと同じ名前の関数の中に、ブロックの処理を書いていきます。

image.png

argsという引数を受け取ることができます。argsの下には、ブロック定義のtextで指定した入力の名前の変数が入っています。

上の例では、一番簡単な処理として、TEXTという値を入力として受け取って、それをログ(デバッグ画面で表示できる)に書き出す、ということをしています。ここは自由に自分の処理を書いてください。

2) REPORTERタイプのブロック

REPORTERも基本的なブロックです。

image.png

REPORTERは、値を作ることに特化しています。値というと、String型やInteger型などさまざまな値を扱うことができます。ただし、基本的にはStringで扱われると考えておいたほうがよいかもしれません。

REPORTERが出す値は、ほかのブロックに入れることができます。
COMMANDブロックの入力として入れることもできます。また、REPORTERブロックの入力にも入れることができるので、こんな感じに何段にも入れ子を作れたりもします。

image.png

では作ってみたいと思います。

REPORTERブロックの定義は、このようになります。

image.png

blockTypeBlockType.REPORTERになります。それ以外はだいたいCOMMANDと同じです。

では、ブロックの実装はどうなるでしょうか。opcodeに指定された名前の関数はこうなります。

image.png

COMMANDブロックと違い、REPORTERブロックはreturn文を使って値を最後に返しています

この値が、ブロックで作った値となります。
このブロックではArgument TEXT is (ここにTEXTという入力の文字列を入れる)という文章(String型)を作っています。

3) BOOLEANタイプのブロック

BOOLEANタイプはREPORTERの特殊なバージョンと言えます。

booleanという、以下の2つしかバリエーションがない値だけを扱うという特殊なバージョンです。

  • true (真[しん]といい、「結果が正しい」ことを表します)か
  • false (偽[ぎ]といい、「結果が間違っている」ことを表します)か

image.png

すこしだけトリッキーな使い方ができます。
というのも、ほかのブロックに入れるときにいくつかのパターンがあるのです。

簡単な使い方は、BOOLEANを入力として受け付けるほかのブロックにくっつける場合です。

image.png

こういうブロックは最初から入力部分が<=>みたいな形になっているので、つながるなーと分かります。
つないでみると、見た目どおり確かにつながります。

次ですが、ほかのブロックにもくっつけることができます。それは、Stringなどほかの値を受け取るようなブロックにくっつける場合です。
下の例を見ると、入力の形がのようになっていてつながらさそうなのですが、下のようにつながってしまいます。これはこれで正しいのです(これで処理が間違わないようにCastをしなければなりませんが)

image.png

では、ブロックを作ってみます。

ブロックの定義はこうなります。ほとんどREPORTERと同じです。

image.png

大事なのは実装です。

image.png

ちゃんとbooleanつまりtruefalseを返さなければいけません

4) HATタイプのブロック

HATタイプはイベント(なにか変わったことが起きたこと)に気づくために必要なブロックです。

image.png

例えば、上の絵のように別のsendブロックから送られたイベントを受け取って、処理を始める、といったときに使います。

このブロックには複雑な処理を書くわけではなくて、何が変わったかについてを指定してあげる必要があります。

さっそくブロックの定義はこうなります。この基本的な内容もCOMMANDと同じです。

image.png

このブロックの実装はこうなります。

image.png

HATの処理はhat1という関数に書いてあります。
内容は、send1という別のブロックで変更した値changedに気づく、という処理を書いています。changedが変わったときにreturn rtnのところでtrueの値を返して終わります。

大事なのは、hat1という関数は常に呼び続けられて、その値が変わったときに次のブロックを実行していくということです。しかも少し癖があって、falseからtrueになったときだけ、イベントとして検知することができます。

なので、下の絵のようにhat1が変わった場合には、2回イベントが検知されることになります。

image.png

ここで少し困ったことになる場合があります。
例えばキーを押し続けたりしてScratchキャットを右に動かし続けるようなプログラムがありますよね。こういうふうに、イベントを連続で検知するときに失敗したりするのです。
なぜかというと、trueを返し続けてしまうからです。

image.png

trueを連続で返すと、Scratchは「値がfalseからtrueになったわけではない」と判断してイベント検知してくれません。したがって、上の絵のようにtrueがずっと出ているのに、イベント検知は1回になってしまいます。

じゃあ、どうするかというと、たとえばこんなふうに必ず一回falseに戻るようにhat1を実装変更することで対応できます。

image.png

結論:ブロックタイプをうまく選ぼう

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

リファレンス

Scratch 3.0 GitHubレポジトリの拡張機能ドキュメント

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away