ビスケットは絵に対して内部状態というものを持ちません.その点がたとえば,KidsimとかAgentSheetなどの先行言語と違うところです.それらの言語には内部状態がオブジェクトのインスタンス変数のようにあって,スクリプト内でそれを参照して振る舞いを数式により記述できるようになっていました.ビスケットでは思い切ってそういった機能を捨てています.つまり,今まで出来ていたことが出来なくなるという思い切ったことをやっています.こういう時代の流れのなかで機能を削るということがどれほど勇気のいることか.
機能を削ったとしても,他の仕組みの組み合わせで似たようなことができるというのが削った理由です.
ここでご紹介するプログラム「温泉」は疲れた人が温泉につかりながら,徐々に疲れを回復してゆく様子を表現します.ビスケットでは異なる絵をつかって異なる状態を表します.疲れた人と元気な人の2状態だけなら,今までのビスケットのプログラムのままでよいですが,ここでは徐々に疲れを回復する様子を表現したい.疲労度100%,疲労度80%,疲労度60%というように少しずつ回復する様子です.これをもちろんそれぞれ異なる絵を使って作るというのが一つのビスケットらしいやり方ではあります.しかし,今回は絵の個数でこれを表現してみましょう.
最初のステージはこうなっています.
メガネは全部で6つ使いました.
上から順に,青い人(疲れた人)は左に動く.温泉につかると少し回復する.この2つ目のメガネを拡大すると,
右側は少し赤みを帯びています.ここでは半透明で赤い人を描いてそれを重ねているので,少し赤みを帯びます.
疲れた人が温泉に入るという条件は何度でもマッチするので,重ねられる半透明の赤い人の数はどんどん増えて行き,赤みが強くなります.
ここで5つ目のメガネが使われます.
ここには,疲れた人と半透明の赤い人が5つ重なっていたら,元気な人(赤い人)に変わる,と書かれています.
完全に元気になると,次は3つ目のメガネ「赤い人は右に進む」にマッチして,温泉から出ます.行った先にはパソコンのようなものがあります.
赤い人がパソコンに重なると,半透明の青い人が一つ重なります.これは疲れを表しています.疲れがどんどん溜まってきて,
のように,赤い人の上に半透明の青い人が5つ重なったとき,青い人(疲れた人)に変わります.で最初にもどって,仕事をやめて温泉に入りに行きます.
実際に走らせたところです.
プログラムはこれです(要Flash)
ビスケットでも状態らしきものは表現できました.ただし,これが可能なのは状態が変わる時には絵が動かないという制約があるからです.たとえば,自動車の内部状態にガソリンの量というがあって,1歩進むたびにガソリンは1つずつ減ってゆく,といったことはなかなか難しいです.ガソリンが100あったとき,ガソリン100個と車が一緒に動くというプログラムがつくれないからです.今のビスケットだったら,車とガソリン100個のとき,車とガソリン99個のとき,車とガソリン98個のとき,という風にすべてのガソリンの量のためのメガネが必要になってしまいます.
これを解決する一つの方法は,パターンマッチングを強力にするということ.たとえば車とガソリンがN個重なっているという状況で,できるだけNが大きくなるようにマッチするといったものです,このときマッチしたN個に対して,メガネの右側では,Nから1を引いた数のガソリン,という表現ができなければなりません.
もう一つの方法(僕はこちらの方が好きですが),画面上にポインタを導入するというものです.ポインタというのは画面上で離れた位置のものに関係を持たせるというもので,たとえば車の位置をステージの上の方で表現して,その車のガソリンの量はステージの下のある場所で表現し,その2箇所をポインタ図形でつなぎます.これで車は自由に動き回ることができ,ガソリンが増えたり減ったりも,この温泉のようなやり方が使えるようになります.
近々,ビスケットにポインタが導入する予定です.これでかなり複雑なプログラムが作れるようになります.