ビスケットのあれこれ

ビジュアル言語ビスケット(Viscuit)に関するあれこれを書いてゆきます.

スクリプト言語拡張

2011-12-18 19:38:50 | 1

ビスケットを教えた後,どうやってテキスト系の言語につなげるのか.そういう質問をよくいただく.僕自身は,ビスケットは英才教育の逆向き,つまり万人に広く伝えたいと思ってやっているので,ビスケットの次はあんまり興味がないのだけど.第一,僕の時代は初心者向けなんてのは無くて,アセンブラからBASICとかPascalなんかを直接やって,それで問題は無かったのだから.英才教育として特別なツールを使う必要はないように思っている.

ではあるけれど,そういう質問をよくいただくので,僕なりの解を考えて実装してみた.

ビスケットにスクリプト言語を導入する.すでに,その拡張を施したビスケットがWebにあるので,ビスケットのホームページの「全部入りのやってみる」を開いてほしい.

ビスケットの全部入りには,本当にごちゃごちゃといろんなものが拡張されているが,ここで拡張されているほぼすべては,右上の「text」を使って拡張してある.試しに,どれか一つ(たとえば上矢印アイコン)をシフトキーを押しながらクリックして見る.テキスト編集のダイアログが出て「#key up」という文字列が見えるだろう.このように#から始まる特別な文字列で,様々な機能が実現されている.

機能は大きく4種類.一つは,それ自身がボタンとなって,それを押すことで何かの動作をするもの.たとえば #command は特殊なコマンドをビスケットインタプリタに送っている.ダイアログが開く場合もある.内部状態もこれで表現されていて,たとえば「はいけいのいろ」で #backgroud の後に2つの数字があるが,これはグラデーションの色を10進数で表したものである.「はいけいのいろ」ボタンをクリックすると背景色を指定するダイアログが出るが,テキスト編集を使って直接指定してもよい(ただし,残念ながら16進表記はないので直接指定するのは難しいと思う).2つの種類は,メガネに入れて使う.メガネの左に入れるのは条件となって,そのメガネを調べるときに毎回条件が成立するかを調べる.右に入れるのはアクションとなって,メガネを実行する際にそのアクションを実行する.最後の1種類は,ステージにおいてつかう.

さて,スクリプト拡張はこれら4種類全部で有効な拡張である.あらかじめ用意されていないので,自分でスクリプト拡張を呼び出す.まずは「text」を持ってきて,シフト+クリックでテキスト編集を開く.ここに#scriptと入力して閉じる.そこにテキストを入力する枠が現れたら成功である.もし「script」の文字が表示される場合は,ビスケットのバージョンが古い可能性がある.ブラウザのキャッシュを削除するとよいかもしれない.

スクリプトには今のところ代入,四則演算,比較しか書くことができない.将来的にはJavascriptを直接呼び出すなどブラウザでできることは全部できるような拡張をするかもしれない.

もっとも簡単な例を示す.スクリプトオブジェクトを作り,a=0を入れる.これをステージに置く.これで初期値が0のaという変数が宣言された.次に,a=a+1というスクリプトオブジェクトを作り,これをどれかのメガネの右側(アクション側)に入れてみる.そのメガネが実行されるたびに,aの値が増加するのがわかるだろう.もう一つ,a<4 のようなスクリプトオブジェクトを作り,メガネの左側(条件側)に入れる.これにより,aの値が4より小さいときというだけ有効なメガネが作れる.このままだと,aが0から4まで増えて終わりなので,別のメガネにa=0とリセットするスクリプトを入れてみてもよいかもしれない.

例として
これ
これは,①のボタン(左下のパッド)を押すとa=0になる.a<4の間aが1増え,音を鳴らし,ミサイルを発射する.ミサイルは飛んでゆく.というプログラムである.ためしに①を押してみると,ミサイルが4発だけ発射され,音が4回なる.

少し考察してみよう.この拡張で今までやれなかったことが,やれるようになったのは事実である.たとえば,シューティングゲームを作ったとき,弾が当たって,敵を倒すまでは簡単にできるが,得点をつけようとするとビスケットでは難しくなる.「score=0」で得点が簡単に計算できる.ゲームの再スタートまできちんと作ることができるならば,ハイスコアも作れるだろう.

ただし,これが今までできなかったのは,ビスケットのマッチングの貧弱さにあった.ビスケットのマッチングは局所的な位置関係で行われるが,得点の計算のように,当たった位置と,得点の位置の配置を気にしたくない場合のパターンの書き方ない.逆にこれを導入すれば,得点の計算はスクリプトを使わなくてもできる.別の言い方をすると,aという名前を使ってリソースの共有が行われている.これはポインタと言ってもよいのだが,ビスケットにポインタを導入すれば(具体的には2点で作られた直線図形)配置によらないで,離れたものに因果関係を伝えられる.

幾つかの関数を呼び出せるようにして,Math.random() < 0.2 のような乱数による振る舞いの変化も簡単に作れるようになるだろう(今はこのrandom機能はない).こういう乱数は好き嫌いがあるが,キー部品と同様に組み込みの部品にしてしまってもよいかもしれない(つまりscriptを使わなくてもできる).

ビスケットの部品(絵)の属性にアクセスするのはどうだろうか.たとえば,スクリプトを置いたメガネに入っている部品を$1, $2という変数で表すことにして,$1.x < 50 のようにして,部品が置かれている位置によって振る舞いを変えることができるだろう.同じようにして,$1.x = 100のように,部品を直接移動させることも可能だろう.また,メガネに部品が2つ以上入っているとき,どの部品が$1,$2に対応するのかを見せる方法が必要である.これは,確かに,ビスケットが用意していない不思議な動きを作り出すためには必須の機能だろう.

ビスケットの絵のマッチングには,sin, cosの計算がどっさり使われているが,同じようにして,全部スクリプトで定義することもできるだろう.もし,完全にビスケットから離れてスクリプト言語だけでこのような当たり判定を作りたければ,こういった計算は避けて通れない関門である.

こうやって,普通の言語でやれるいろんなことは大体できそうだ,ということはわかるのだけど.ビスケットを拡張すればスクリプトなど使わなくてもできそうな部分もある.しかし,スクリプトを使えば使うほどビスケットの面白さがどんどん失われていくような気がしないでもない.非常に危険な拡張である.