MNAの世界

ブログをリニューアルしました!コメント、リンク、ツイートなどはお気軽にどうぞ。

C/C++

[C++]GetKeyboardState() と DirectInput

投稿日:2009年11月2日 更新日:

会社での待機時間を利用して新フレームワークの製作をちょくちょく進めています。
以前思いついたメンバ関数のコールバック機構を発展させて、イベント通知ギミックを完成させたので、次は入力系統のクラス作成にとりかかりました。

キーボード入力の部分は以前と同じように GetKeyboardState() でちゃちゃっと作ってしまうかと思ったのですが、そういえばこのAPIでは取れないキーが多数存在するんですよね。
Zen-Ichiでは使うキーが固定されていたので特に問題になることはありませんでしたが、今後キーコンフィグなどを作る際に反応しないキーがあるのはまずいです。
というわけでキーボード入力取得部分をDirectInputに置き換えます。
これなら全てのキーを取得することが可能です。

ところでDirectInputには厄介な問題があります。
それは Acquire()。
キーボードの状態を取得する前に実行しなければいけないAcquireですが、こいつはほんのちょっとしたタイミングでよく失敗してくれるんですよね。
しかも、そのアフターケアがまずいとすぐにヘソを曲げてしまって、二度とキー状態が取得できない状態に陥ります。
その辺の対策が面倒だったのでDirectInputを使うのを避けていたのですが、もうそんなことも言ってられないです。
なんとかうまいこと実装。
無事全てのキーが取得できるようになりました。

しかし、DirectInput・・・というかキーの特性上、妙な挙動をするものがいくつかあることが発覚。
例えば、カタカナキー、半角キーなどは、一度押すと特定の操作をするまでは押しっぱなしとみなされます。
Pauseキーは押した瞬間しか押されたとみなされません。
むむ、これは困った。
でもステマニとかでも同じ現象が起きているので、これはそういうものだと思うしかないのかな。

とはいえ、事情を知らないユーザーからは「バグってんじゃないの?」と思われる可能性もあります。
上記のような挙動をすることを甘んじて受け入れるか、予め特定のキーは取得対象からはずすか・・・
今度は「なんで選択できないの?」とか言われそうですが、キーボードでそんなキーを使う人も少ないだろうから妥協するしかないのかなぁ。

-C/C++


comment

リンクが多数含まれていると表示されないのでご注意ください。(スパム対策)

関連記事

no image

[C++]非staticなメンバ関数をコールバックで呼ぶ方法

!!!注意!!! これは思いついたことを試しにやってみたらそれっぽく動いたというお話です。 今はstd::functionとstd::bindが標準搭載されていますのでそちらを使いましょう。 現在、G… 続きを読む

no image

浮動小数点のワナ

ただいま絶賛滋賀で作業中です。 片道2時間です。若干キレ気味です。 さて、今回もマージなんぞを任されたわけですが、俺としたことが珍しくトラブってました。 その原因は浮動小数点。 機能の追加によってとあ… 続きを読む

no image

PNGに対応

ついに新フレームワークでの動作を開始したZen-Ichiですが、フルカラー化&高解像度化の影響でロード時間がとてつもなく長くなってしまいました。 これではネオジオCDになってしまいます。 (ちなみに当… 続きを読む