会社での待機時間を利用して新フレームワークの製作をちょくちょく進めています。
以前思いついたメンバ関数のコールバック機構を発展させて、イベント通知ギミックを完成させたので、次は入力系統のクラス作成にとりかかりました。
キーボード入力の部分は以前と同じように GetKeyboardState() でちゃちゃっと作ってしまうかと思ったのですが、そういえばこのAPIでは取れないキーが多数存在するんですよね。
Zen-Ichiでは使うキーが固定されていたので特に問題になることはありませんでしたが、今後キーコンフィグなどを作る際に反応しないキーがあるのはまずいです。
というわけでキーボード入力取得部分をDirectInputに置き換えます。
これなら全てのキーを取得することが可能です。
ところでDirectInputには厄介な問題があります。
それは Acquire()。
キーボードの状態を取得する前に実行しなければいけないAcquireですが、こいつはほんのちょっとしたタイミングでよく失敗してくれるんですよね。
しかも、そのアフターケアがまずいとすぐにヘソを曲げてしまって、二度とキー状態が取得できない状態に陥ります。
その辺の対策が面倒だったのでDirectInputを使うのを避けていたのですが、もうそんなことも言ってられないです。
なんとかうまいこと実装。
無事全てのキーが取得できるようになりました。
しかし、DirectInput・・・というかキーの特性上、妙な挙動をするものがいくつかあることが発覚。
例えば、カタカナキー、半角キーなどは、一度押すと特定の操作をするまでは押しっぱなしとみなされます。
Pauseキーは押した瞬間しか押されたとみなされません。
むむ、これは困った。
でもステマニとかでも同じ現象が起きているので、これはそういうものだと思うしかないのかな。
とはいえ、事情を知らないユーザーからは「バグってんじゃないの?」と思われる可能性もあります。
上記のような挙動をすることを甘んじて受け入れるか、予め特定のキーは取得対象からはずすか・・・
今度は「なんで選択できないの?」とか言われそうですが、キーボードでそんなキーを使う人も少ないだろうから妥協するしかないのかなぁ。