これだけでも、1つのボタンのOFF/ONは判定可能だ。
イコール判定すればできる。
WHILE 1
WAIT
B=BUTTON()
IF B==&B0001 THEN ?"↑"
IF B==&B0010 THEN ?"↓"
IF B==&B0100 THEN ?"←"
IF B==&B1000 THEN ?"→"
WEND
だが斜め方向に押した場合や、他のボタンを同時押しした場合、途端にTHEN文が実行されなくなる。
複数のボタンが押された場合でも、該当ボタンのOFF/ONを判定したければ、ビット演算が必要になる。
WHILE 1
WAIT
B=BUTTON()
IF (B AND &B0001)!=0 THEN ?"↑"
IF (B AND &B0010)!=0 THEN ?"↓"
IF (B AND &B0100)!=0 THEN ?"←"
IF (B AND &B1000)!=0 THEN ?"→"
WEND
この例では、(B AND &B0001)などのAND演算した計算結果が 0 でなかった場合、THEN文が実行されます。
つまり、特定ボタンのビットのみを取り出し、そのボタンが押されたかを判定しています。
これで斜め押しや、他のボタンとの同時押しした場合でもTHEN文を実行できるようになりました。
これを簡略化してみます。
WHILE 1
WAIT
B=BUTTON()
IF B AND &B0001 THEN ?"↑"
IF B AND &B0010 THEN ?"↓"
IF B AND &B0100 THEN ?"←"
IF B AND &B1000 THEN ?"→"
WEND
IF文などの判定式では、実は「0以外か」という判定をするものなので、( )!=0 という条件式は省略できます。
更に簡略化してみます。
WHILE 1
WAIT
B=BUTTON()
IF B AND 1 THEN ?"↑"
IF B AND 2 THEN ?"↓"
IF B AND 4 THEN ?"←"
IF B AND 8 THEN ?"→"
WEND
2進数は10進数で書くことも当然できるので、10進数で書いたほうが短いです。
ボタンのビット値を書いても、どのボタンか判り難いですよね。
そこで、プチコン3号の新しめのバージョンでは、ボタンのビットを表す定数値が用意されました。
WHILE 1
WAIT
B=BUTTON()
IF B AND #UP THEN ?"↑"
IF B AND #DOWN THEN ?"↓"
IF B AND #LEFT THEN ?"←"
IF B AND #RIGHT THEN ?"→"
WEND
この書き方をした方が、後でプログラムを読むとき、解りやすいです。