KbWait
[secs, keyCode, deltaSecs] = KbWait([deviceNumber][, forWhat=0])
いずれかのキーが押されるまでKbWaitを呼び出したところでプログラムは止まります。KbCheckと同様に、キーを押したときの時間を秒単位で、キーの状態をkeyCodeとして返します。すべてのキーが押されていないことを確認し、1つのキーが押されるのを待ちます。
注意点
KbWaitは周期的にキーの状態をチェックします。ある時点でキーが押されていなければ、5ms 待ってからもう一度キーが押されたかをチェックします。これはシステムへの負荷を避けるためです。
以上の理由から、KbWaitで測定した反応時間には、少なくとも5msの誤差が含まれていることになります。
(KbCheckのdeltaSecsに関する説明も参考にしてみてください)
KbWaitが正しく動いていない場合は、"stuck keys"と呼ばれる不具合が生じている可能性があります。
これについては以下の2つのヘルプを見てください。
help DisableKeysForKbCheck
help RestrictKeysForKbCheck
(「2.6.2 キーボード入力」も参考にしてみてください)
GetChar と CharAvail コマンドは、入力された文字を重視していて動作が遅く、KbCheck と KbWait はキー押しを重視していて動作が速いです。
MatlabのコマンドウィンドウでKbWaitの動作を確認するときは注意が必要で、KbWaitの後に押したエンターキーに対してすぐに反応してしまうでしょう。KbWaitをテストするには、
WaitSecs(0.2);KbWait
としてみてください。
KbWaitはキーを押すタイミングではなく、キーを離す タイミングを測ることもできます。このような動作をしたいときは引数forWhatを1にしてください。
KbWaitであるキーを押したときの反応を取得するには、引数forWhatを2にしてください。このときKbWaitはすべてのキーが押されていないことを確認して、キー入力を待ちます。
具体的には次のようにします。
KbWait([], 2);
このときはキーを押したらすぐにKbWaitの次の行にプログラムが進むことに注意してください。
引数forWhatが3のときは、あるキーが押されてそのキーが離されるまで待ちます。
つまり、次のような流れになります。
- すべてのキーが押されていないことを確認する
- あるキーの入力を待つ
- すべてのキーが押されていないことを確認する
- 押したキーの情報を返す