解決されていますが、少しだけ考え方の補足をしてみたいと思います。
ifの(実際の)仕様 と「&」の考え方 を勘違いしているとハマりやすい罠の1つだと思います。
まず、if自体は「0以外の数字のとき」に条件を満たすという判定をします。逆に「0の場合」のみ条件を満たさない(else)ということになります。
「え、条件式を書くんでしょ? >=(以上) や <(未満) みたいな記号も使えてるけど?」と思われるかもしれません。
ifで使われている『条件式』はそれ単体で機能し、条件を満たしているときに「1」となり、満たしていなければ「0」となります。
mes (11 > 2) や mes (11 < 2) 等をやってみると分かりますが、条件式自体は計算式であるかのように振る舞います。
そして「&」の考え方ですが、、、
言葉で伝えるのが難しい(ニガテ)なので、下のスクリプトを実行してみてください。
#define mes0b_8bit(%1) gcx=ginfo_cx : p1=%1 : mes strf("%%3d -> 0b",p1),1 : repeat 8 : mes p1>>(7-cnt)&1,1 : loop : p1="%1" : p1=strtrim(p1) : if p1!str(%1)&p1!="cnt"{mes " ( = "+p1+" )",1} : mes "" : pos gcx
mes "それぞれの数値や条件式の結果を2進数で表示しています。"
mes ""
key = 11
A = 9
B = 2
mes0b_8bit key
mes0b_8bit A
mes0b_8bit key&A
if key&A : color 255 : mes "if OK(0以外!)" : else : color ,,255 : mes "if NG(0だよ!)"
color : mes ""
mes0b_8bit key
mes0b_8bit B
mes0b_8bit key&B
if key&B : color 255 : mes "if OK(0以外!)" : else : color ,,255 : mes "if NG(0だよ!)"
color : mes ""
mes0b_8bit key&A
mes0b_8bit key&B
mes0b_8bit (key&A) & (key&B) ;優先順位に注意! →もし「 key&A | key&B 」の場合どの記号も優先順位が同じなので手前から順に処理され →「 ( (key&A) | key ) & B 」となってしまいます。括弧を使いましょう。
if (key&A) & (key&B) : color 255 : mes "if OK(0以外!)" : else : color ,,255 : mes "if NG(0だよ!)"
color : mes "" : mes ""
mes "【 解決策の案 】"
mes0b_8bit (key&A)!0
mes0b_8bit (key&B)!0
mes0b_8bit (key&A)!0 & (key&B)!0
if (key&A)!0 & (key&B)!0 : color 255 : mes "if OK(0以外!)" : else : color ,,255 : mes "if NG(0だよ!)"
「&(and)」や「|(or)」等は『論理演算』と言います。
「key & A」は、key と A という2つの数値を 2進数 で表したときにそれぞれ同じ桁のビットを見て両方 1 だった場合、出力するとき(key & A)も 1 にします。それを全ての桁で行っています。
(詳しくはネットで検索すると正しくもっとわかりやすい情報がたくさんあると思います。気になったら「|(or)」も調べてみてください。)
今回アキアキノヒロロさんの言っていたのは、3つ目の例に当てはまります。
key&A も key&B も「0以外」にはなるけれど、それぞれ 1 になっているビットの位置がかみ合っていないので、(key&A) & (key&B) してしまうと「0」になってしまうわけです。
解決策としては、上記のように (key&A)!0 で先に「0 か 1」にしてしまう方法が考えられます。
;ただし、そのままでもタマタマ上手くいってしまうこともあります。
;例えば、B = 3 に変更してみて下さい。3つ目の例も OK になることがわかります。
「え、待って! なんでそもそもそんな2進数に置き換えて考えないといけないようなものを使ってるの!? stick命令の説明でも書いてあるし!」
と思ったかもしれませんが、これはこれで『複数のスイッチON/OFF』判定にとても便利なのです。
例えば、stick命令に使われているキーを2進数で表示してみましょう。
#define mes0b_8bit(%1) gcx=ginfo_cx : p1=%1 : mes strf("%%3d -> 0b",p1),1 : repeat 8 : mes p1>>(7-cnt)&1,1 : loop : p1="%1" : p1=strtrim(p1) : if p1!str(%1)&p1!="cnt"{mes " ( = "+p1+" )",1} : mes "" : pos gcx
mes "stickで使われるキー"
カーソルキー左 = 1
カーソルキー上 = 2
カーソルキー右 = 4
カーソルキー下 = 8
スペースキー = 16
Enterキー = 32
Ctrlキー = 64
ESCキー = 128
mes0b_8bit カーソルキー左
mes0b_8bit カーソルキー上
mes0b_8bit カーソルキー右
mes0b_8bit カーソルキー下
mes0b_8bit スペースキー
mes0b_8bit Enterキー
mes0b_8bit Ctrlキー
mes0b_8bit ESCキー
mes ""
mes "stickの変数を2進数表示!(カーソルの左と上の2つとかを押してみよう!)"
gcy = ginfo_cy
repeat
redraw 0
color 255,255,255 : boxf ,gcy : color : pos 0,gcy
stick _stick_, -1 ;全部を非トリガータイプキー指定
mes0b_8bit _stick_
/*
if _stick_ & 1 : mes "左!"
if _stick_ & 2 : mes "上!"
if _stick_ & 4 : mes "右!"
if _stick_ & 8 : mes "下!"
*/
redraw 1
await 16
loop
それぞれ1つの桁だけに「1」が出てきますよね。
この1つ1つの桁が『スイッチのON/OFF』の判定に利用できる!ということになります。
数値の範囲は -2147483648 ~ 2147483647 で、32ビットです。(HSPの整数型[int])
「1つの数値で32個のスイッチON/OFFを同時に表現できる」という風に考えることができます。