トップページ > 過去ログ > 記事閲覧
ジョイスティックを使っています
名前:PORI 日時: 2011/02/16 15:25

ジョイスティックを持っているのでそれがDXライブラリで認識されているのか確認していたところ、3軸のレバーの動きはきちんと認識されていたのですが、 ハットスイッチやスロットルレバーの動きを認識する方法がわかりません。 動きを認識する方法があればよろしくお願いします。

Page: 1 |

Re: ジョイスティックを使っています ( No.1 )
名前:管理人 日時:2011/03/05 01:45

DirectInput から得られる情報をそのまま取得するための関数を追加しましたので、 よろしければこちらのバージョンをダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』、VCをお使いの場合は『リビルド』をして下さい) 以下の関数を追加しました // ジョイパッドから DirectInput から得られる生のデータを取得する( DX_CHECKINPUT_KEY や DX_INPUT_KEY_PAD1 を引数に渡すとエラー ) int GetJoypadDirectInputState( int InputType, DINPUT_JOYSTATE *DInputState ) ; 第二引数の DINPUT_JOYSTATE は今回新たに追加した構造体で、次のように定義しています // DirectInput のジョイパッド入力情報 struct DINPUT_JOYSTATE { int X ; // スティック0のX軸パラメータ( -1000〜1000 ) int Y ; // スティック0のY軸パラメータ( -1000〜1000 ) int Z ; // スティック0のZ軸パラメータ( -1000〜1000 ) int Rx ; // スティック1のX軸パラメータ( -1000〜1000 ) int Ry ; // スティック1のY軸パラメータ( -1000〜1000 ) int Rz ; // スティック1のZ軸パラメータ( -1000〜1000 ) int Slider[ 2 ] ; // スライダー二つ unsigned int POV[ 4 ] ; // ハットスイッチ4つ( -1:入力なし 0:上 4500:右上 9000:右 13500:右下 18000:下 22500:左下 27000:左 31500:左上 ) unsigned char Buttons[ 32 ] ; // ボタン32個( 押されたボタンは 128 になる ) } ; 使い方は以下のように構造体のアドレスを渡します DINPUT_JOYSTATE joy ; GetJoypadDirectInputState( DX_INPUT_PAD1, &joy ) ; 現在世に出回っているゲーム入力デバイスは当初 DirectInput で想定していた範囲に収まらない ものが出てきてしまったのか、どのボタンがどのパラメータに相当しているかはデバイス毎に異なります ( 例えば Xbox360 のコントローラの Lトリガーと Rトリガーの値は Z のプラスとマイナスで返ってきます ) なので、PORIさんがお使いのデバイスもどの入力装置がどのパラメータとして得られるかは 実際にこの関数から得られるデータを表示してみないとわかりません というわけで、GetJoypadDirectInputState で得られる情報を表示するサンプルプログラムをこちらに載せましたので、 よろしければこちらでご確認になってみてください m(_ _)m #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { DINPUT_JOYSTATE input ; int i ; // ウインドウモードで起動 ChangeWindowMode( TRUE ); // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1; // 描画先を裏画面にする SetDrawScreen( DX_SCREEN_BACK ); // メインループ(何かキーが押されたらループを抜ける) while( ProcessMessage() == 0 ) { // 画面のクリア ClearDrawScreen() ; // 入力状態を取得 GetJoypadDirectInputState( DX_INPUT_PAD1, &input ) ; // 画面に情報を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "X:%d Y:%d Z:%d", input.X, input.Y, input.Z ) ; DrawFormatString( 0, 16, GetColor( 255,255,255 ), "Rx:%d Ry:%d Rz:%d", input.Rx, input.Ry, input.Rz ) ; DrawFormatString( 0, 32, GetColor( 255,255,255 ), "Slider 0:%d 1:%d", input.Slider[ 0 ], input.Slider[ 1 ] ) ; DrawFormatString( 0, 48, GetColor( 255,255,255 ), "POV 0:%d 1:%d 2:%d 3:%d", input.POV[ 0 ], input.POV[ 1 ], input.POV[ 2 ], input.POV[ 3 ] ) ; DrawString( 0, 64, "Button", GetColor( 255,255,255 ) ) ; for( i = 0 ; i < 32 ; i ++ ) { DrawFormatString( 64 + i % 8 * 64, 64 + i / 8 * 16, GetColor( 255,255,255 ), "%2d:%d", i, input.Buttons[ i ] ) ; } // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; }
Re: ジョイスティックを使っています ( No.2 )
名前:PORI 日時:2011/03/06 20:00

管理人さんありがとうございます。お陰で殆どの操作が認識できました。 参考までに以下にそれぞれ反応した物を記述しておきます。 ちなみに使用しているのはマイクロソフト製フォースフィードバック2です。 ジョイスティック1軸目2軸目:X,Y 3軸目:Rz(PSパッド右スティック用2軸目?) HAT:POV 0 ボタン1からボタン7:Button0-6 ボタン8:認識せず ボタン8だけ何故か認識されていませんでしたが、骨董品ですしボタンが壊れているのだと思います。いずれにせよプログラムを組む上で支障はありません。 本当にありがとうございます。 デバイス毎に対応するパラメーターが違うというのも初めて知りました。その点に注意してプログラムを作っていこうと思います。

Page: 1 |