久しぶりのブログです。
みなさん、ビスケットの割れたメガネってご存じですか?
知る人ぞ知る、というか、僕としてはあまり満足した仕様じゃないので、インディーズ機能として追加していたものですが。ただ、あまりに強力な機能のため、他のプログラミング言語が得意な人にとっては、一度使うと、やめられないというか。
頑張って考えれば、割れたメガネを使わないで似たようなものは作れたりするのですが。
割れたメガネのことについては、過去のブログをご覧ください。これをパッと読んで、なにかよくわからない方は、わからなくて何も問題ありません。どちらかというと普通のプログラミング言語で普通にできることが、ビスケットではとてもやりにくいわけですが、割れたメガネはそういところで力を発揮する仕組みです。普通のプログラミング言語を知っている人は、すぐに使い方がわかるものです。
で、僕はこれまであまりこの機能を積極的には使ってきませんでした。少なくとも僕が子供に教える活動や動画などでは、一切使ってきませんでした。これを使わなくても十分楽しめるようなものを考えていたので。
それでも、一部の人(つまり他のプログラミング言語を知っている人)にとっては、すこぶる便利で、なくてはならない機能になってしまっているようです。それで、ときどきこの割れたメガネについて質問がきます。特に、昨年Flashが使えなくなってから代わりにリリースしたブラウザ版のビスケットでは若干動きが違うので、その辺りの質問が時々いただきます。
結論を先に言うと、僕には理想の割れたメガネの仕様があって、それを作った時にきちんとしたビスケットの機能としてリリースするつもりです。いまは、旧アプリで展開していた割れたメガネと同等の機能をギリギリ提供していて、ある意味、仮の姿、インディーズ機能として、ということです。
あ、そもそも「割れたメガネ」という呼び方も、今後は変わると思います。というのもレンズが割れたような表示になっていたから「割れた」という言い方をしてましたが、今回のは割れてもいないですから。
まず、ブラウザ版のビスケットを起動します。メガネをだして、まんなかの部分(矢印があるところ)をタップ(クリック)すると、
のような丸のボタンが出ます。これがメガネを割るボタンです。これを押して、メガネを一回動かしてみてください。すると、
のように、レンズに影が2つ現れます。これがメガネが割れたことです。
ちなみにこの状態でまた、メガネの矢印をタップすると、さらに影が2つ追加されます。以前の割れたメガネでは、3分割までしかできませんでしたが、新しいバージョンではいくつでも影を追加できます。
どんなことができるかというと、
たとえば、これで、「棒人間が2人いて、1人がボールを持っていたら、それを相手にパスする」というメガネになります。
ステージに棒人間を2名とボールを置けば、お互いにパスする動きになります。おもしろいのは、ステージに棒人間を4名にすると、
ランダムにボールをパスし続ける動きになります。
旧アプリでは、ボールの動きが連続したなめらかなアニメーションになってましたが、その辺りの扱いが変わったために、このビスケットではなめらかではなく、パッとボールが飛んでいきます。その部分はちょっと残念。
では、次の例をみてください。
赤と緑の信号機があって、魚は赤の時は止まって、緑の時は進む、というものです。信号機はタップすると変わります。
メガネが割れているので、信号機がどこにあっても魚は進んだり止まったりします。
(ちなみに、この例は、旧アプリではちゃんとは動きません。旧アプリは「さわったら」が入っているメガネの優先度が高くなかったので、赤信号をタッチしても、赤信号と魚のメガネと優先度が同じなので、タッチで色が変わる可能性が1/2になっているのでした。新しいビスケットはタッチを優先するので、どんなときもタッチしたら信号を切り替えます)
これを応用してステージに魚を2匹いれたとしましょう。
ここで、みなさんはどんな動きを想像しますか?これらのメガネでどう動いて欲しいと思いますか?
たぶん、信号を緑にしたら、2匹の魚が一斉に泳ぎ出す、と思いませんでした?
残念ながら、いまのビスケットはそう動きません。どちらかの魚が1匹だけランダムに選ばれて一歩動いて、またランダムに選ばれて一歩、と動きます。なぜでしょう。
この理由を、想定学年の小学3年生にちゃんとと伝えることは僕は無理だと思いました。かなり理不尽な仕様だからです。わかる子はいると思います。でも、大人でもピンとこない人もいらっしゃるんじゃないかな。特に、ビスケットって、他の言語は無理だけどビスケットなら、という人たちが沢山使ってくださっているけど、その人たちには結構難しい。だいたい僕も最初これを作った時「あれ?」って思ったぐらいでしたから。
この理由を説明するには、これがよいです。
方眼紙モードにして、四角を書いて、斜めで交互に動くものです。これは問題なく思った通りに動きます。
では、ステージに四角を3つおいたらどうなるでしょう。
3つにしたら、たとえば、
<ー>
このように交互に動くように思いますか?たしかにそんな感じもしますが実際は違います。
<ー><ー>
真ん中のVから左と右にランダムに行ったり来たりします。
これまで、あまりちゃんと説明してませんが、ビスケットの大事な仕様の一つに、「一つの絵は同時に1回の書き換えにしか参加できない」というのがあります。Vの真ん中の四角は、右上の四角とペアになって上のメガネとマッチするか、左上の四角とペアになって下のメガネとマッチするか、そのどちらかをランダムに選ぶわけです。
四角を4つ以上にして横にギザギザと並べてみたり、ダイヤの形で並べてみたり、いろいろと意外な動きになるんで面白いですよ。
で、さっきの魚と信号機ですが、真ん中の四角に相当するのが信号機なわけです。信号機は1つしかないので、1匹の魚を動かしたらもう1匹の魚は動かすことができないということなのです。
パタパタの例では、真ん中の四角自身も動くので変じゃないですが、信号機の場合は、実際には同じ場所で同じ色のままなので、変に感じます。
コンピュータの専門的な話をすると、データベースのトランザクションのところで出てくるんですが。読み出しだけの場合と、読み書きの場合とで対象のロックが違うということです。よくわからないですよね。信号機は動くわけじゃなくて、見るだけなんで、みんなで一斉に見ても減らないよねってことです。それに対して読み書きをする場合は、同時に読み書きするとおかしなことになるから、誰か1人に読み書きを限定して変なことがおきないようにしているのです。こういう仕組みがビスケットの言語のなかに隠れているのです。
単純なメガネの場合は、読むだけということは意味がないのですが、割れたメガネ(というかメガネの影)の場合は、絵の状態を読むだけの場合もあるんですね。
もう一度、読み書きを整理すると、
たとえば、このメガネは緑の信号があると、緑の信号を消して魚は前に進みます。これは
こうして、緑の信号機が3つあるので、信号機をランダムに消しながら、魚が3歩すすみます。魚が2匹以上いた場合は、それぞれが進んだ合計が3歩になります。どのようにランダムに魚が選ばれても、動いた合計は必ず3歩になるというのがいいですよね。これが読み書きということです。もし2匹の魚が1つの緑の信号機を同時に掴んで同時に消したら、1つの信号機で合計2歩動いたことになってしまいます。なので、どれか1匹の魚しか掴めないようになっているのです。
これでもいいですね。これは、魚が前に進むと同時に、緑の信号機が上に進みます。
魚が3匹いると、3匹が進んだ合計の分だけ緑の信号機が上に進みます。2匹が同時に1つの信号機を掴んで1つ上にあげたら、合計より少ない分しか上がらないですよね。だから禁止されています。
それに対して、最初の例
これは、信号機は動きもしないし、消えてもいないです。なので、複数の魚から同時に掴まれても本当は問題ないのです。ところが実際には1匹しか動けません。
ここで、一つの案があります。それは、メガネの左右がまったく同じ場合は特例として、複数の魚と同時にペアを組める、とする方法です。
方眼紙などでピタッと動かないのを簡単に作れるならその案もありです。ピタッと一致しているときになにか一致しているマークを見せるとか。
ただ、一致しているかそれとも1mmくらいズレているか、というのは人間の目で見たらほとんど区別がつきません。単独のメガネだったら、1mmくらいのズレは「すごくゆっくりうごく」ということで、少しのメガネの違いは、少しの動きの違いになるので納得しやすいです。ところが、今回は、本当に一致したら全部の魚が同時に動くのに、1mmでもずれると1匹ずつしか動かない、というのはなんか納得いきません(逆に9割の魚が同時に動くようにつくれたらそれはそれで面白い仕様ですねぇ)。
ということで、もっと明確に見た目が違うようにできないか。やりたいことは、その絵がどこかにあるかどうか調べるだけで、その絵を消したり動かしたりという書き込みをするつもりはまったくないということ。つまりメガネの右側がない状態です。
ということで、次のような文法を考えています。
片側にしかレンズの影がない状態です。これは明確に「緑の信号機がどこかに存在したら」という意味にできます。書き込みはやらないので、複数の魚を同時に動かすことができます。
割れたメガネのよくある例題にリモコンというのがあります。画面に置かれた右ボタンを押したら、どこかにいるキャラが右に動く、というやつです。これもキャラを複数置いたらすべてのキャラを同時に動かしたいところですが、そんなときは右ボタンをタッチしたら、というのを左の片側レンズに入れればよいのです。右ボタンの絵が絶対に動かないというのも保証されるので、それも直感にあってますよね(以前は、右ボタンをピッタリ動かないようにおかないと、タッチしているうちに右ボタンがずれてしまいました)。
ビスケット周辺のプログラミングに追われて、ビスケット本体のプログラミングがなかなかできないのですが、こんなものを作りたいと考えているということでした。