最終更新 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ボタンが押されている*/
}
|