IchigoJam web
IchigoJam web by jig.jp では、「I/O」をクリックすると入出力端子の状態を確認・操作できるUIが出てくる。
ここにはチェックボックスがあり、チェックを入れるとHIGH、チェックを外すとLOWを入力することを表す。
ここには、「BTN IN9」と書かれた項目もある。
BTN()
IchigoJam BASIC の BTN()
は、ボタンが押されているとき1、押されていないとき0を返すとされる関数である。
IchigoJam BASIC リファレンス ver 1.4
ボタンが押されていれば1、そうでないとき0を返す(数:0(付属ボタン)/UP/DOWN/RIGHT/LEFT/SPACE/X(88)、省略で0、-1でビットパターンで返す)
ボタンが押されていれば1、そうでないとき0を返す(数:0(付属ボタン)/UP/DOWN/RIGHT/LEFT/SPACE/X(88)、省略で0、-1でビットパターンで返す)
IchigoJam-BASIC/BTN.txt at master · fu-sen/IchigoJam-BASIC
ボタンが押されている状態の場合は 1、押されていなければ 0 を返します。
BTN にチェックが入っていても BTN() が 0 を返した
「BTN IN9」の下のチェックボックスにチェックを入れ、インタラクティブ (RUN
で実行していない) モードで ?BTN()
を入力して BTN()
の返り値を表示してみると、0
と表示された。
?IN(9)
も試してみたが、これも0
が表示された。
以下のプログラムを RUN
して試すと、チェックボックスの状態がきちんと反映された。
10 CLS
20 LOCATE0,0
30 ?DEC$(BTN(),5)
40 ?DEC$(IN(9),5)
50 GOTO20
例えば ?IN(1)
は、RUN
を用いなくてもチェックボックスの状態が反映された。
不都合の正体
実は、IchigoJam web の BTN()
や IN(9)
は、このチェックボックス以外にマウスクリックの入力も受け付ける。
そして、チェックボックスを操作した後にマウスクリックをすると、マウスクリックによる入力がチェックボックスより優先されるため、BTN()
や IN(9)
の返り値がチェックボックスの状態と合わなくなるようである。
実際、マウスクリックを押したまま ?BTN()
を実行すると、RUN
を使わなくても 1
が表示された。
BTN() の動作がリファレンスに反する
「BTN IN9」のチェックボックスをオンにした後、マウスクリックをせずに ?BTN()
を実行すると、1023
が表示された。
…そう、1023が表示されたのである!
リファレンスによれば、BTN()
はボタンが押されていれば1、そうでなければ0を返すはずなのに!!
嘘つき!!!
先日紹介したWAIT
や TICK()
で用いる時間の単位が通常より長い上、WAIT
と TICK()
で時間の単位が異なる件といい、IchigoJam web はリファレンスに反する動作をしがちのようだ。
イースターエッグかな?
作者の方針は知らないが、私はこんなものは求めていない。
実機とwebで異なる挙動をするのはいいが、リファレンス、もしくは『🍓🅱️ IchigoJam BASIC コマンド一覧 command reference (Japanese)』に明示しておいてほしい。
改善策の検討
まず、「マウスクリックでの操作が BTN IN9 のチェックボックスに反映されてほしい」と考えた。
しかし、前述の通り、マウスクリックで操作した場合は BTN()
は 1
を返すが、チェックボックスで操作した場合は BTN()
はリファレンスに反して 1023
を返すのである。
チェックボックスをマウスクリックに同期させた場合、1
を返すべきか 1023
を返すべきかわからなくなるかもしれない。
…と思ったが、さらに考えると、「マウスクリックされたらそれに合わせてチェックボックスの状態を変化させる」だけで、「チェックボックスが操作されたらそれに合わせてマウスクリックの状態を変化させる」わけではないので、通常のマウスクリックによる操作と同様に 1
を返すのが妥当そうである。
これはあくまで自分の意見であり、作者は他の意見を持つ可能性がある。
証拠動画
わかりやすいよう、開発者ツールから以下のコードを実行し、マウスクリックの状態を表示させた状態で動画を撮影した。
e = document.createElement("span");
e.setAttribute("style", "position: fixed; top: 1em; left: 1em;");
document.addEventListener("mousedown", function() {
e.innerHTML = "クリック ON";
});
document.addEventListener("mouseup", function() {
e.innerHTML = "クリック OFF";
});
e.innerHTML = "クリック OFF";
document.body.appendChild(e);
おわりに
※この記事は執筆時点での情報に基づく。
※IchigoJamはjig.jpの登録商標です。