連打ってどうやんの †
晴れ。シューティングゲームを進めていた。
ゲームは1秒間にメインループを何回実行するかの単位でフレームというのを使う。60フレームだと1秒間に60回描画タイミングがある。普通に作るとこれと同じだけの処理タイミングを持てる。ゲームがアニメーションしたりキーの入力に反応して動いたりということを毎秒フレームの数だけ行なっている。キーの入力を検知するのは前のフレームで押されていなかった部分が今回のフレームで押されていたらキーが入力されたと判断する。連射の場合、押→離→押と3回判定すると2回ボタンが押されたことになる。押→押は押しっぱなしと判定する。連射とフレームレートの関係は密接で、例えばフレームレート60で処理中に、ユーザーが最初のキーを押してから1/120秒後にもう一度押したとしても、プログラム中では最初のフレームで押を検知し、1/60秒後の次のフレームでも押を検知したので2連打ではなく押しっぱなしと判定してしまう。
ソフトウェアがフレーム中に押/離を検知する作り上、60フレームの判定状態では秒間30連打、30フレームでは秒間15連打が理論上最大になる。ハードウェアがキーの押し下げを通知してくれる環境、要は「押しっぱなし、離し、押し下げ」が別々に判定ができる環境であれば、毎フレーム押し下げを検知することで60フレームで60連射が可能になるだろう。昔のシューティングプレイヤー界隈では基板のクロックとシンクロして確実にフレームレートに合わせて連打ができる装置なんてものを自作して使っていたよなんて話も聞いたことがある。奥が深いなぁ。