« 転送ツールとインストーラー | メイン | xp3 の暗黙 Intent 対応 »

2012年08月11日

吉里吉里Java:: ゲームパッド対応

    

ゲームパッドを買ったので Nexus 7 につないで確認してみたら、全く反応しなかった。
吉里吉里のキーコード VK_PAD1 ~ VK_PAD10 に対して、Android のキーコード KeyEvent.KEYCODE_BUTTON_1 ~ KeyEvent.KEYCODE_BUTTON_10 を割り当てていたが、送られてきていたのは KeyEvent.KEYCODE_BUTTON_A ~ の方だった。
KeyEvent.KEYCODE_BUTTON_1 は Key code constant: Generic Game Pad Button #1. となっているんだけど、これは何で送られてくるんだろうか?
何にしても KeyEvent.KEYCODE_BUTTON_A ~ の方で反応するようなので、そちらに変更し確認してみると問題なく動作した。
ただ、十字キーを押すとフリーズしたようになる。
デバッガで追うとインプットイベントがひたすら発行されている様子。
PC 版の方では問題なく動いている。
調べるとどうも VK_PADLEFT と VK_LEFT、VK_PADRIGHT と VK_RIGHT…… と同じキーコードを割り当てていたのが原因の様子。
Android の場合キーボードの十字キーもゲームパッドの十字キーも同じ KeyEvent.KEYCODE_DPAD_LEFT 等を送ってくるので、同じものにしていたけど問題だったようだ。
吉里吉里のパッドのキーコードは独自のキーコードを割り当てて、キーの送信元デバイスを見て、キーボードならキーボードのキーコードのまま、ゲームパッド等ならゲームパッドのキーコードに変換する形にした。
デバイスの判定は KeyEvent.getDevice().getSource() で行える。

ついでにアナログ入力について調べてみた。
アナログ入力は、Activity.onGenericMotionEvent で送られてくる MotionEvent を見て判断すればいいようだ。
Android 3.1 と GamePad のイベントの詳細 (2)に詳しく書かれていた。
Android 3.1 Platform のゲームパッドに付いての説明も参考になる。
アナログ入力は今のところ使わないがメモしておく。



投稿者 Takenori : 2012年08月11日 22:34




comments powered by Disqus
Total : Today : Yesterday : なかのひと