どうも、たびたびお世話になっています。
今回は、ゲームパットについてお聞きしたいと思っています。
ゲームパットからの入力データを得るにはどうしたらよいですか。一応ジョイパットのプログラムを参考にしたり、ほかのサイトのサンプルを使ったりして作成はしていますが、ゲームパットからの入力をうまく認識しません。サンプルをおいてくださると助かります。大変勝手なお願いですが、よろしくお願いします。
一応サンプルも貼り付けておきます。
要点
・ゲームパットから入力されたデータを確認する
最終目的
・キャラクターを動かす
使用コントローラ
・ELECOM(JC-2410TWH)
ゲームパットを使うには?
Re:ゲームパットを使うには?
MSDN の下記のページにジョイスティック(ゲームコントローラのこと)を使用するためのチュートリアルがあります。
http://msdn.microsoft.com/ja-jp/library ... 85%29.aspx
一応、こちらでも適当なサンプルを書いてみますが…。
http://msdn.microsoft.com/ja-jp/library ... 85%29.aspx
一応、こちらでも適当なサンプルを書いてみますが…。
Re:ゲームパットを使うには?
書いてきました。
コードが長いので添付しておきます。
一応、自作ライブラリから一部変更しての書き下ろしなので、何か問題があるかもしれません。
とりあえず、これに沿ってプログラムを組めば動くはずです。
なお、ジョイパッドの方向キーの状態を取得する場合、 DIJOYSTATE2(DIJOYSTATE) 構造体の lX, lY メンバ変数で下記のような条件で取得できます。
上: lY < 0 の時
下: lY > 0 の時
左: lX < 0 の時
右: lX > 0 の時
このとき、PSコントローラのようなスティックでも操作できるようになるのですが、
スティックはなにも触らなくても必ず 0 になることはなく、若干の偏りが発生するため、
上記のような判定でキャラクターを動かすようにしていた場合は、スティックが有効になったとたん、
勝手に移動することになってしまいます。
これを防ぐためには遊びの部分を作ることで対処します。
だいたい +-300 程度(軸の可動幅量を +-1000 とした時)でいいでしょう。
つまり、
上: lY < -300 の時
下: lY > +300 の時
左: lX < -300 の時
右: lX > +300 の時
となります。
コードが長いので添付しておきます。
一応、自作ライブラリから一部変更しての書き下ろしなので、何か問題があるかもしれません。
とりあえず、これに沿ってプログラムを組めば動くはずです。
なお、ジョイパッドの方向キーの状態を取得する場合、 DIJOYSTATE2(DIJOYSTATE) 構造体の lX, lY メンバ変数で下記のような条件で取得できます。
上: lY < 0 の時
下: lY > 0 の時
左: lX < 0 の時
右: lX > 0 の時
このとき、PSコントローラのようなスティックでも操作できるようになるのですが、
スティックはなにも触らなくても必ず 0 になることはなく、若干の偏りが発生するため、
上記のような判定でキャラクターを動かすようにしていた場合は、スティックが有効になったとたん、
勝手に移動することになってしまいます。
これを防ぐためには遊びの部分を作ることで対処します。
だいたい +-300 程度(軸の可動幅量を +-1000 とした時)でいいでしょう。
つまり、
上: lY < -300 の時
下: lY > +300 の時
左: lX < -300 の時
右: lX > +300 の時
となります。
Re:ゲームパットを使うには?
プログラムを組んだのですが、うまくいきません。どこがいけなかったでしょうか?
プログラム
if ( Key[ KEY_INPUT_UP ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_UP ) == 1){ //上ボタンが押されたら
ch.muki=0;} //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_LEFT ) == 1){ //左ボタンが押されたら
ch.muki=1;} //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_DOWN ) == 1){ //下ボタンが押されたら
ch.muki=2;} //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_RIGHT) == 1){ //右ボタンが押されたら
ch.muki=3;} //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
4方向に歩くプログラムのKEY_INPUTの後にGetJoypadInputStateをいれて試していますが、DAWNしか反応しません。コントローラがいけないのかと、コントロールパネルで動作確認をしたのですが、どこにも異常はありませんでした。
プログラム
if ( Key[ KEY_INPUT_UP ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_UP ) == 1){ //上ボタンが押されたら
ch.muki=0;} //上向きフラグを立てる
else if( Key[ KEY_INPUT_LEFT ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_LEFT ) == 1){ //左ボタンが押されたら
ch.muki=1;} //左向きフラグを立てる
else if( Key[ KEY_INPUT_DOWN ] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_DOWN ) == 1){ //下ボタンが押されたら
ch.muki=2;} //下向きフラグを立てる
else if( Key[ KEY_INPUT_RIGHT] == 1 || (GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_RIGHT) == 1){ //右ボタンが押されたら
ch.muki=3;} //右向きフラグを立てる
else //何のボタンも押されてなかったら
ch.walking_flag=0; //歩かないフラグを立てる
4方向に歩くプログラムのKEY_INPUTの後にGetJoypadInputStateをいれて試していますが、DAWNしか反応しません。コントローラがいけないのかと、コントロールパネルで動作確認をしたのですが、どこにも異常はありませんでした。