過去の日記

2015-12-06 [長年日記]

Scratchの"画面を再描画せずに実行する"がけっこう速いのこと [tech]

この記事は、Scratch Advent Calendar 2015 6日目の記事です。


内容はタイトルのまんま、Scratch2.0から追加になったカスタムブロックのオプション"画面を再描画せずに実行する"がなかなかの速さなことに気がついた、という話です。


"画面を再描画せずに実行する"ブロックはScratch2.0のここにあります。

"ブロックを作る"ボタンを押すと設定するためのポップアップが出てきます。
作りたいブロックの名前を入れて(ここでは"描画する"って入れてます。矛盾してますね。その理由はあとで)、"画面を再描画せずに実行する"にチェックを入れてください。

こうやって作ったカスタムブロックは、その実行中に画面が書きかわりません。
ブロックの中でスプライトを移動したりしても、移動の途中経過が全然見えないのです。
じゃあそれはなんに使うの? っていうことになりますね。


カスタムブロックと普通のブロックを比べられるようなプロジェクトを作ってみました。
左のボタンは"このスプライトがクリックされたとき"のブロックに続けて処理を書いています。
右のボタンは"画面を再描画せずに実行する"カスタムブロックに処理を書いて、"このスプライトがクリックされたとき"のブロックでそのカスタムブロックを呼び出しています。

https://scratch.mit.edu/projects/90295109/

https://scratch.mit.edu/projects/90295736/

https://scratch.mit.edu/projects/90303879/

どうでしょう?
それぞれ、ペンとスタンプとクローンの機能を使ってたくさんの書き換えをおこなっています。
でも、スピードが全然違いますよね。

つまり、たくさん画面を書きかえる処理をまとめて実行するのに、その途中経過を表示しないことが速度的に役立つんです。だから、"画面を再描画せずに実行する"ブロックなのに"描画する"って名前をつけたわけです。


"画面を再描画せずに実行する"カスタムブロックのスピードがあると、こんなこともできます。

https://scratch.mit.edu/projects/90303762/


ステージの描画以外にも変数を変化させた時の値の描画が省かれますから、変数を表示させたいけど一部分だけ重い計算があってその計算だけカスタムブロックにする、という使い方もありそうです。


最後に、このカスタムブロックを活用したプロジェクトをリンクしておきます。

まずは、拙作の迷路生成プログラムです。

Maze Generator
https://scratch.mit.edu/projects/83327886/

初期状態だと29×21個の"壁ブロック"を描いています。一つの"壁ブロック"を描くのに4本の線をペンを使って描いているので、一回の描画で2,436本の線を描いています。
迷路の生成が一つ進むたびに画面を全部再描画しています。


迷路を生成したら、解きたくなりますね。

Maze Solver

https://scratch.mit.edu/projects/86037626/


壁/ゴール/探索済みの経路/探索中の経路/とその末端 を色を変えるだけで表現しています。描画しているブロックはほとんど Maze Generator と同じです。

CoderDojo 仙台と仙台泉のメンターなどをしていますけど、Scratchでこんなにまじめにプログラム書いたのは初めてでした。


最後に、このカスタムブロックの使い方を知った元になったプロジェクトを紹介します。

Game of Life
https://scratch.mit.edu/projects/28841238/

コンウェイのライフ・ゲームですね。
このプロジェクトを見たのが始まりでした。楽しい時間をありがとうございました。


では、Enjoy Programming!!