Inputモジュールの新仕様を考える

ちょっといじってみたが、これはなかなか難しい。
とりあえず考えてみよう。


まず、割り当て関連から。
現在、Input.setConfig(pad, key)という形式にしているが、これはそのままにする。
いまの動作は、パッドに対して同一の入力と判定されるキーを登録する。
これを、逆方向にも同時に登録されるようにする。
キーに対して同一の入力と判定されるパッドのボタンを登録するわけだ。
問題なのは、パッドは1つじゃないというところ。
パッドにキーを割り当てる場合は、キーのコードをボタンごとに持たせるだけだったが、逆方向はパッド番号も持たせる必要がある。
また、この方法で割り当てを追加すると、

Input.setConfig(P_BUTTON0, K_Z)
Input.setConfig(P_BUTTON0, K_X)

とした場合に、K_ZとK_Xの判定にP_BUTTON0でも反応するようにはなるが、パッドに対するキーは上書きされるから、P_BUTTON0の判定にはK_Xしか反応しなくなる。
複数を1つに割り当てる場合は多いほうで判定するのが当たり前だから、それはそれでよいと思う。
1.0.4の実装では

Input.setConfig(P_BUTTON0, 0)

とすると割り当てが解除されていたが、これはキーコード0が使われていないためであり、そういう機能を作ったわけではない。
新しい仕様でそれをすると、パッドに対するキーの割り当てが解除されるだけで、キーに対するパッドの割り当ては解除されないことになる。
P_BUTTON0を割り当てたキーを検索して解除してやる必要があるか。
でも仕様上は1つのキーに複数のボタンを割り当てることもできるから、

Input.setConfig(0, K_Z)

みたいな書き方も許可しないといけない。
しかしパッドの0番は←ボタンとして使われてるから、0を指定するのはまずい。
解除は-1とかにしておく必要がありそうだ。っていうかRubyなんだからnilだろ。
双方向の割り当てを自動でやるから問題であって、例えば

Input.setConfig(P_BUTTON0, K_Z)
Input.setConfig(K_Z, P_BUTTON0)

のように自分で双方向に登録しないといけなくすれば、少しはわかりやすくなるが、大変面倒くさい。
定義したり解除したり、複雑なことをリアルタイムでやることもあまり考えられないし、普通に使うときに簡単なほうがよかろう。


次にオートリピート。
いまは設定がすべてのキーで共有されるが、これをキーごとに設定できるようにする。
現在の仕様では、

Input.setRepeat(wait, interval)

となっているが、これを例えば

Input.setRepeat(key or pad, wait, interval)

という感じにする。
この場合の問題点は、キーコードとパッドのボタンコードがかぶっているところだ。
padXxxx?系とkeyXxxx?系でメソッドがわかれているのはそういえばそれが原因だった。
ほんとはマウスだろうがキーだろうがパッドだろうが、定数を突っ込んだらpush?とdown?でどれでも判定できればスマートだったのだが。
まあ、互換性も無くなるからsetRepeatの引数を変えることはしないで、全てのキーのオートリピートをまとめて変更するメソッドとして今と同じ機能で残せばいいだろう。
やるなら

Input.setKeyRepeat(key, wait, interval)
Input.setPadRepeat(pad, wait, interval[, padnumber])

の2つを追加する感じだ。


ところで、現在のInput.xxxPush?系メソッドは、フレームごとに前回の情報を勝手に保存して、それと今回の比較で押したかどうかを判定する。
普通のアクションゲームなら毎フレーム取得するだろうから問題は無いが、たとえばある条件が整ったタイミングでその瞬間押されたかどうかを見ようと思ったら、入力チェックのフレームにピッタリ押したタイミングが合わないと判定できない。
そんな作り方するほうが悪いとは思うが、これを解決するためには、フレームごとに全ての前回情報を残していくのではなく、xxxPush?系が呼ばれたときに残せばよい。
しかしそれをすると今度はオートリピート関連に影響が出る。
どうするかは悩みどころだが、このへんは前の仕様のままにしておこう。
Push?系メソッドはそういうもんだから、変な使い方はしないよーに。