BUTTON命令は1/60秒ごと(VSYNC 1の時間ごと)に更新されます。
VSYNC 2以上(WAIT 2以上)にしてしまうと、その間に押された瞬間を通り過ぎてしまって正しく判定できなくなります。
逆にVSYNC 1を入れないと、上の図のように同じ判定を2回以上することになってしまい、うまく動きません。
(したがってVSYNCを入れなければ60fpsより速くボタン操作ができる、という考えは間違いです。NewSPver1の失敗)
上の図ではBUTTON(2)で説明していますが、(1)や(3)でも同じです。
ちなみに(0)は押されている間ずっと反応するのでVSYNCなしでも動きます。
F4さんのコードで言うなら、WAIT 5ではなくWAIT 1(VSYNC 1)で動かす必要があります。
WAIT 5を使わずにボタン入力を待つにはどうするかというと、自分でVSYNC5回分を数えればいいんです。
下の例ではBCOUNTという変数で、ボタンが押されてから5→4→3...と数えます。BCOUNTが0になったときだけボタンが反応します。
(ただしボタンが離されたらBCOUNTはすぐ0に戻さないと連打ができなくなります。)
WHILE 1
IF BUTTON()==#UP AND SELECT!=0 AND BCOUNT==0 THEN SELECT=SELECT-1:BCOUNT=5
IF BUTTON()==#DOWN AND SELECT!=3 AND BCOUNT==0 THEN SELECT=SELECT+1:BCOUNT=5
'ボタンが離された時
IF BUTTON()==0 THEN BCOUNT=0
'数える
IF BCOUNT>0 THEN BCOUNT=BCOUNT-1
(SEL△とか 省略)
WAIT 1
WEND
上の例ではBUTTON()を使いましたが、BUTTON(1)とBREPEATを使うともっと簡単にできますね。
BUTTON(1)は自分で数えなくても上のようなことをプチコンがやってくれる命令です。ただしVSYNC 1(WAIT 1)がないとうまく動きません。
さすらいの74さん
INKEY$はBUTTONとは違って、一回実行するとINKEY$の中身は無くなります。(確か古いBASICの仕様だったような)
例えば
WHILE 1
?INKEY$();
?INKEY$();
VSYNC 1
WEND
のようにしても、入力は1回しか表示されません。
なので、INKEY$を2回以上使う場合は必ず一度変数に入れておかないといけません。