ゲームパッドの状態を調べる

最終更新 2003 09/24

サンプルのダウンロード → API_joyGetPosEx.lzh(54k)

サンプルプログラムのスクリーンショット

全ソースコード



joyGetNumDevs 関数
joyGetPos 関数
joyGetPosEx 関数
    
    対応しているバージョン
    95, 98, Me, NT3.1以降, 2000, XP
    
    使用するヘッダとライブラリ
     mmsystem.h
    winmm.lib
ゲームパッド(ジョイパッド)のボタンの状態を調べるには joyGetPosEx() 関数を使います。 注意しなければならないことは、ゲームパッドの状態を調べるまえに そのパッドが使えるか、あらかじめ調べておく必要があります。 使えないようなら別の使用できるパッドを探して、見つかったら そのパッドを使うように設定しなおさなければなりません。 大きく分けると 1.ゲームパッドの状態を保存しておく構造体を宣言 2.使用できるゲームパッドを調べる 3.ゲームパッドの状態を調べる こんな流れで処理をします。 サンプルでは、ゲームパッドの状態を保存しておくための構造体を 作ってます。( GAMEPADSTATE 構造体 ) GAMEPADSTATE 構造体は GAMEPADSTATE pad[ GAMEPAD_USENUM ]; と配列で宣言します。 これは1P、2Pに対応させるためです。 配列の0番目が1P、1番目が2Pのパッドに対応しています。 プレーヤー1のゲームパッドの状態を調べたいときは pad[0] の メンバ変数の値を調べます。 プレーヤー2なら pad[1] のメンバ変数の値を調べます。 if( pad[0].isLeft ) { /* プレーヤー1のパッドの左ボタンが押されている */ } 4人同時プレイすることを予想しているなら GAMEPAD_USENUM の値を 4 にすれば、4つのゲームパッドに対応できるようになります。 対応できると言っても、ゲームパッドが4つパソコンにつながってて 正常に動作できる状態になっていないと使えませんが・・・。 パソコンに接続できるゲームパッドの数は joyGetNumDevs() 関数で 調べることができます。 でも、接続できるゲームパッドが全て使えるとは限りません。 (パソコンとゲームパッドが繋がってなければ使いようがないので・・・。) そこで使えるゲームパッドがあるのかを、最初に調べる必要があります。 使えるかどうかを調べるには joyGetPos() 関数を使います。 joyGetPos() 関数は引数に JOYINFO 構造体のアドレスを渡さないと いけないので、関数を呼び出す前に JOYINFO ji; のような感じで 構造体変数を宣言しておきます。 joyGetPos() 関数の戻り値を調べたいだけなので ji のメンバ変数の値を 初期化する必要はありません。 joyGetPos() 関数の引数には他に、使えるかどうか調べたいゲームパッドの IDを渡します。 IDは0〜?までの UINT 型の値です。どの値のIDまで使えるのかは さっきも説明した joyGetNumDevs() 関数で調べることができます。 調べたいゲームパッドのIDと JOYINFO 構造体変数のアドレスを joyGetPos() 関数に渡して、戻り値が JOYERR_NOERROR なら そのIDのパッドは使用することができるということになります。 使えるゲームパッドのIDが取得できたら、ボタンが押されているかを 調べることができます。 ゲームパッドのボタンが押されているかどうかを調べるには joyGetPosEx() 関数を使います。 さっきの joyGetPos() でも調べることができるのですが、joyGetPosEx() 関数の方はもっと複雑なゲームパッドの状態を調べることができます。 上下左右とボタン4つで済むゲームなら joyGetPos() を使う方が楽で よいと思います。 joyGetPosEx() 関数の戻り値が JOYERR_NOERROR なら、ゲームパッドの 状態を正常に取得できたことになるので、どのボタンが押されているのかを 調べます。 ボタンの状態は joyGetPosEx() 関数の引数に指定した ji に 格納されています。 上下が押されているか調べるときは ji.dwYpos の値を調べます。 値が 0 なら上が押されていて 65535なら下が押されていることになります。 左右は ji.dwXpos です。0 は左、65535 は右です。 上下左右以外のボタンは最高32個まで調べることができます。 現時点では大抵のゲームパッドは8ボタンまでなので32個も調べる必要は ないと思いますが・・・。 ボタンの状態は ji.dwButtons に格納されています。押されているボタンの 番号に対応するビットが1になります。 たとえば、ボタン1が押されている時は0ビット目が1になります。 ボタン4なら3ビット目が1になります。 このビットの値を調べるには ji.dwButtons と &(アンド) をとります。 if( ji.dwButtons & (DWORD)pow( 2, ボタンX - 1 ) ) { /*Xボタンが押されている*/ }

| home |