複雑なロボットを制御するために、2つのジョイスティックの状態を読み込むプログラムを作ったので、メモっておく。
Windowsでは、ジョイスティックの状態を読み込むためには、マルチメディアのAPI「mmsystem.h」を用いる。
具体的には、下記のJOYINFOEX構造体を用いる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757112(v=vs.85).aspx
JOYINFOEX構造体を使うためには、ヘッダーファイルmmsystem.hをインクルードする必要がある。ただし、mmsystem.hの前に、windows.hをインクルードしておかないとエラーがでるので注意が必要。
#include <windows.h> //これが無いと、mmsystem関連のエラーがでる #include <mmsystem.h>
また、プロジェクトのプロパティの「リンクー」->「入力」->「追加の依存ファイル」に、「winmm.lib」を追加する。
そして、main関数で、JOYINFOEX構造体変数を宣言・初期化した後、ジョイスティックのIDとJOYINFOEX変数を指定してjoyGetPosEx関数を実行して、ジョイスティックの状態を取得する。ここで、ジョイパッドのIDとしては、JOYSTICKID1、JOYSTICKID2のように順番に指定する。取得したジョイスティックの状態は、それぞれJOYINFOEX構造体のメンバ変数を用いて参照することができる。例えば、ジョイスティック1のX軸方向の値は、joy1.dwXposにより参照することができる。
https://msdn.microsoft.com/en-us/library/windows/desktop/dd757108(v=vs.85).aspx
以下は、2つのジョイパッドの状態を読み込み、それぞれのX,Y軸の位置と、ボタンの値を表示するプログラムの例である。
// JOYINFOEXの初期化 JOYINFOEX joy1; JOYINFOEX joy2; joy1.dwSize = sizeof JOYINFOEX; joy1.dwFlags = JOY_RETURNALL; joy2.dwSize = sizeof JOYINFOEX; joy2.dwFlags = JOY_RETURNALL; while (1){ //ジョイスティック1の位置とボタンの値の取得 if (joyGetPosEx(JOYSTICKID1, &joy1) == JOYERR_NOERROR){ //ジョイスティック2の位置とボタンの値の取得 if (joyGetPosEx(JOYSTICKID2, &joy2) == JOYERR_NOERROR){ // X, Y軸の位置と、ボタンの値出力 printf("x1:%d,y1:%d,button1:%d\t x2:%d,y2:%d,button2:%d\n", joy1.dwXpos, joy1.dwYpos, joy1.dwButtons, joy2.dwXpos, joy2.dwYpos, joy2.dwButtons); } } }
下記からプログラム一式をダウンロードすることができる。
https://drive.google.com/open?id=0B3uB4w2FEJbIS0M5bHJlMEIyeUE
下図は実行例である。
ちなみに、PCで認識されたジョイスティックは、以下のように「デバイスとプリンター」にジョイスティックのアイコンで表示される。また、アイコンを右クリックし「ゲームコントローラーの設定」を、ジョイスティック名を選択し、右クリックで「プロパティ」を選択することにより、ジョイスティックの動作確認ができる。