■ゲームパッド(ジョイパッドと言うらしい)を使ってみる
ジョイパッドの一つ目(0番)に接続して状態を読み取ります。
ボタンの状態はJOYINFOEX構造体に入って返ってきます。
矢印キーはdwXposとdwYposの値が変化します、中央値は0x7fffでキーが押されるとそれぞれの値が増減します。
アナログモードだとスティックの変化に対してdwXposとdwYposの値が変化します
アナログモードで無いと値が0と0x7fffと0xffffを取りました。
ただ、ジョイパッドにより違う値をとるときがあるみたいです
他のジョイパッドを試した所、中央値が0x7effでした。
ELECOM JC-U3412S 中央値 0x7fff
RIX RX-JPAD-RD 中央値 0x7eff
スティックが2個あるジョイパッドの場合は2個目の矢印キーはdwZposとdwRposに割り当てられてました。
各種ボタンはdwButtonsの値から読み取れます、各ビットに割り振られてます。
#pragma comment(lib, "winmm.lib")
#include <stdio.h>
#include <windows.h>
int main(){
JOYINFOEX JoyInfoEx;
JoyInfoEx.dwSize = sizeof(JOYINFOEX);
JoyInfoEx.dwFlags = JOY_RETURNALL;
for(unsigned int i=0;i<joyGetNumDevs();i++){//サポートされているジョイスティックの数を返す
if(JOYERR_NOERROR == joyGetPosEx(i, &JoyInfoEx))
printf("ジョイスティック No.%d 接続されています\n",i);
}
Sleep(1000);
while(1){
if(JOYERR_NOERROR == joyGetPosEx(0, &JoyInfoEx)){ //0番のジョイスティックの情報を見る
printf("dwXpos = 0x%x\t"
"dwYpos = 0x%x\t"
"dwButtons = 0x%x\n",
JoyInfoEx.dwXpos,
JoyInfoEx.dwYpos,
JoyInfoEx.dwButtons);
}else{
printf("エラー\n");
}
Sleep(100);
}
return 0;
}
▼実行結果
ゲームパッドを操作すると数字が変化するはずです。
ジョイスティック No.0 接続されています
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
dwXpos = 0x7eff dwYpos = 0x7eff dwButtons = 0x0
■ジョイパッドの変化をウィンドウメッセージで受け取る
joySetCaptureを使うとウィンドウメッセージで受け取れるそうです。
ただし内部ではスリープを使うそうなので無限ループと同じかと思います。
joySetCapture(
ウインドウハンドル,
JOYSTICKID1 または JOYSTICKID2,
定期的に問い合わせる時間ミリ秒,
位置フラグ FALSEだと定期的に送ってくる)
調べてみるとこのような関数らしいです。
ウインドウアプリケーションのメッセージループをいじれば動くみたいです。
LRESULT CALLBACK WndProc(HWND hWnd,UINT msg,WPARAM wp,LPARAM lp){
switch(msg){
case WM_CREATE:
ジョイスティック1のキャプチャ開始
30ミリ秒ごとに問い合わせる
if(JOYERR_NOERROR!=joySetCapture(hWnd, JOYSTICKID1, 30, FALSE)){
}
break;
case MM_JOY1MOVE:
joySetCaptureのフラグがFALSEだから十字キーが押されたとか関係なく
定期的にメッセージが飛んでくるよ
LPARAMの上下ワードに十字キーのxy位置が入ります
break;
case MM_JOY1BUTTONUP:
JOY_BUTTON1CHG,JOY_BUTTON2CHG,JOY_BUTTON3CHG,JOY_BUTTON4CHGが使えるらしい
if(JOY_BUTTON1CHG==wp){
ボタン1が上がった
}
break;
case MM_JOY1BUTTONDOWN:
JOY_BUTTON1,JOY_BUTTON2,JOY_BUTTON3,JOY_BUTTON4が使えるらしい
if(JOY_BUTTON1&wp){
ボタン1が押された
}
break;
case WM_CLOSE:
キャプチャを止める
joyReleaseCapture(JOYSTICKID1);
break;
}
return 0;
}
このような感じにすると動くそうです。
なにはともあれ実際に動かしてみたほうが手っ取り速いかも。
ジョイスティック1に接続して画面上に十字キーのデータを表示
ボタン1のダウンとアップでメッセージボックス表示
するテキトウに作ったサンプルプログラム
joypad1.ZIP
実行ファイル+ソース VC6で作成
▲トップページ
>
Windows と C++