Scratch少しわかってきたけどいろいろつらい

Scratchで子供が遊んでいるのに感化されて週末少しづつ何かを作るのをやっていてだんだんわかってきた。ちゃんとした仕様がどこに書かれているのかよくわかっていない(調べてないのが悪いという気もする)けどわかったことは下記のようなことであった。

 

  • 変数はグローバル変数と、スプライトのインスタンス変数しかない
    スプライトから他のスプライトのインスタンス変数にはアクセスできない(スプライトへの参照を持つことができない)のでわりとつらい。その結果としてグローバル変数を使いまくることになるのだけどそれはそれで。グローバル変数のように見えているものは内部ではステージのインスタンス変数になっているようなのだがステージの変数だけが他から丸見えというのも不思議といえば不思議だ。
    ちなみにステージとスプライトをあわせて「ターゲット」というらしい。まあ普通の言語で言うオブジェクトである。
  • スプライトのインスタンス(クローン)を作るときに引数を渡すことができない
    これも割と辛くて、だって普通のオブジェクト指向的なやつで何かをつくるときって
    tama = new Tama(x, y)
    ってやったあと
    tama.hoge()
    みたいにアクセスできるわけじゃないですか。Scratchはそれがなくて
    clone()  // 自分のインスタンス変数が複製されて受け継がれる
    もしくは
    Tama.clone() // プロトタイプのスプライトのインスタンス変数が使われる
    しかないような感じ(表記は違うけどさ)。どっちもcloneしたスプライトの参照を取得できないから後からは実質なにもできず、cloneする前に自分自身の変数を変更して前者(自分自身のクローン)を使うか、グローバル変数に相手に受け取って欲しい情報を詰め込んで後者を使うしかない。でも後者を書いていいのは実行順序に関して完璧に理解していることが必要になるので、普通はやってはいけない。
  • オブジェクト間のメッセージのやりとりとして、「メッセージを送る」という命令(ブロック)があるのだけど、上記のように各インスタンスの参照を使うことができないので、この「メッセージを送る」命令はブロードキャストしかできない。しかもメッセージに引数をつけて送ることができない。グローバル変数と「メッセージを送って待つ」というやつを使えばこの問題を回避できるのかもしれないが、なんだか挙動を把握するまでにまたいろんな試行錯誤が必要そうに感じるので使ったことがない。
  • 比較演算子が少ないせいでサボって変な書き方になりがち。具体的にはC系の言語などでの「>=」「!=」に相当するものがなく、もともと「x >= 1」とか「x != 0」と書きたいところ「(x > 1)または(x = 1)」とか「(x = 0)でない」のような表記にしないといけなくて操作が面倒なのでサボって「x > 2」「x = 1」と書いてしまいがちで、イヤな気分になる。
  • ループ変数がないのもつらい。「10回繰り返す」はあるのだがカウンタは隠されているので、「x を 0 にする」→「10回繰り返す」→(そのループの中で)「x を 1ずつ変える」のようにして自分でループ変数を作ってやらなければいけない。
  • サブルーチンとしてブロック定義というものが使えるのだけど、ローカル変数とか関数の戻り値がないのとかもあって本当にサブルーチンとしてしか使えないように感じた。あ、引数だけはそのブロック定義内スコープになっているので、それを利用すれば…引数は変更できないので、ローカル変数的なものが発生するたびに次のブロック定義に処理を引き渡せば実現可能…でもそれはさすがに直感的じゃなさすぎるだろう。

というような感じで非常に制限が奇妙で、ある意味パズル的な頭の使い方が必要で面白いといえば面白いのだが、それは本当に頭を使うべきところなのかというところが割と微妙。

これはもう自分の勝手な言語で作ってScratchに変換してやったらいいんじゃねーか? とか思ったりもしたのだけど(Scratchのファイルフォーマットは Scratch File Format - Scratch Wiki に解説されている)、「そんなふうにして作ったものをアップロードしちゃダメだよ」とちゃんと利用規約に書かれていた。

You may only submit user-generated projects that were created with (1) the Scratch website editor or (2) an unmodified copy of the Scratch editor

Scratch - Scratch Terms of Use

 

Scratch内で絵がかけたり音が編集できたり(絵も音もエディタはとてもよくできていると思う)、あと画像の色を変えたり効果をつけたりするのは(機能があるものに関しては)非常にかんたんにできて楽しい。絵と音とコードがまとまってsb3という1ファイルに収まるのも素敵である(実体はzipファイルであるがパッケージ形式が決まっていることが良い)。