トップページ > 過去ログ > 記事閲覧
ジョイパッドの右レバー入力情報の不具合
名前:Drile 日時: 2011/07/06 22:49

GetJoypadAnalogInputRight関数の引数、int *XBuf , int *YBufが逆になっているようです。 具体的に言うと、横方向にレバーを倒すと、 YBufの値が変動し、縦方向にレバーを倒すとXBufの値が変動し、 GetJoypadAnalogInput関数と逆になっています。 以下、ソースです。 上の値が右レバーの(X,Y) 下の値が左レバーの(X,Y)です。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int Cr ; int InputX , InputY ; char String[ 64 ] ; ChangeWindowMode( TRUE ); if( DxLib_Init() == -1 ) // DXライブラリ初期化処理 { return -1; // エラーが起きたら直ちに終了 } // 描画先画面を裏画面にする SetDrawScreen( DX_SCREEN_BACK ) ; // 白色の値を取得 Cr = GetColor( 255 , 255 , 255 ) ; // ESCキーが押されるまでループ while( ( GetJoypadInputState( DX_INPUT_KEY_PAD1 ) & PAD_INPUT_9 ) == 0 ) { // メッセージ処理 if( ProcessMessage() == -1 ) { break ; // エラーが発生したらループを抜ける } // パッド1の入力を取得 GetJoypadAnalogInputRight( &InputX , &InputY , DX_INPUT_KEY_PAD1 ) ; // 画面に入力状態を表示する { ClearDrawScreen() ; wsprintf( String , "Right:X = %d" , InputX ) ; DrawString( 0 , 0 , String , Cr ) ; wsprintf( String , "Right:Y = %d" , InputY ) ; DrawString( 0 , 16 , String , Cr ) ; } GetJoypadAnalogInput( &InputX , &InputY , DX_INPUT_KEY_PAD1 ) ; // 画面に入力状態を表示する { wsprintf( String , "Left:X = %d" , InputX ) ; DrawString( 0 , 100+0 , String , Cr ) ; wsprintf( String , "Left:Y = %d" , InputY ) ; DrawString( 0 , 100+16 , String , Cr ) ; } // 裏画面の内容を表画面に反映させる ScreenFlip() ; } DxLib_End() ; // DXライブラリ使用の終了処理 return 0 ; // ソフトの終了 }

Page: 1 |

Re: ジョイパッドの右レバー入力情報の不具合 ( No.1 )
名前:管理人 日時:2011/07/10 20:14

ご報告ありがとうございます ご迷惑おかけしてすいません、現在出回っているPS1デュアルショックから始まる 2スティックあるジョイパッドは右側スティックの入力情報が機種によって割り当てられる 出力先がばらばらになっている( 統一されていない )関係で、GetJoypadAnalogInputRight では 正常に入力値が得られない場合があります 例えば、今私がPCで使用しているPSタイプのジョイパッドは、右側スティックの 横方向の入力が DirectInput の情報としてはZ軸として情報が出力され、 縦方向の入力が Z軸回転として情報が出力されます ( ハードウェア的には「回転」入力をするための装置はPSタイプのジョイパッドには存在しません ) ところが、Xbox360 用コントローラのPC版では右側スティックの横方向の入力が X軸回転として出力され、縦方向の入力がY軸回転として情報が出力されます 原因はわかりませんが、恐らく DirectInput の標準的なジョイスパッド入力の仕様に 2個以上スティックが存在することが考慮されていなかったために、右側スティックの 入力を何の情報として出力すればよいか困ったジョイパッドや変換器を開発しているメーカーが、 仕方が無いのでZ軸入力やZ軸回転として出力するようにした( マイクロソフトは Xbox360 コントローラの右側スティックの出力はX軸回転、Y軸回転に割り当てた ) といった経緯だと思います GetJoypadAnalogInputRight を作成した頃は私はPSコントローラをPCで使えるように するための変換器やPS型ジョイパッドの右側スティックが出力先として割り当てる DirectInput での出力値は統一されていると勘違いしていたため、Z軸を右側スティックの 横方向の入力値として、Z軸回転を右側スティックの縦方向の入力値として GetJoypadAnalogInputRight を作成しましたが、その後そんなルールは無く右側スティックの 出力先は統一されていないことを知りました 何か良い手は無いかと考えていましたが、良い落としどころが今のところ見つけられていないので 次のバージョンでは GetJoypadAnalogInputRight の関数をひとまずリファレンスから外そうと思います ( 注意書きつきで DxLib.h には残しておこうと思います ) 右側スティック入力の取得については DirectInput が返す情報をそのまま取得する為の関数 GetJoypadDirectInputState をお使いください // ジョイパッドから DirectInput から得られる生のデータを取得する( DX_INPUT_KEY や DX_INPUT_KEY_PAD1 を引数に渡すとエラー ) int GetJoypadDirectInputState( int InputType, DINPUT_JOYSTATE *DInputState ) ; // DirectInput のジョイパッド入力情報構造体 struct DINPUT_JOYSTATE { int X ; // X軸パラメータ( -1000〜1000 ) int Y ; // Y軸パラメータ( -1000〜1000 ) int Z ; // Z軸パラメータ( -1000〜1000 ) int Rx ; // X軸回転パラメータ( -1000〜1000 ) int Ry ; // Y軸回転パラメータ( -1000〜1000 ) int Rz ; // 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 になる ) }; この関数は DirectInput で取得できるジョイスパッドの入力情報をそのまま得ることができる 関数なので、右側スティックの入力がどこに割り当てられていてもその情報を得ることができます ただ、まず何処に割り当てられているかを知る必要があると思いますので、その作業には 以下のサンプルプログラムをお使いください // GetJoypadDirectInputState の出力値を画面に表示するサンプルプログラム #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; } ただ、2度目になってしまいますが、右側スティックの出力先はジョイパッド全体では統一されていません 現に私の使用しているジョイパッドでは GetJoypadDirectInputState は正常な値を取得できますが、 Drile さんがお使いのジョイパッドではXとYが逆転しています、 更に Xbox360用コントローラのPC版では何を入力しても0が返ってきます なので、 GetJoypadDirectInputState を使用する場合、どの部分を右側スティックの入力値とするかは、 何パターンか用意してオプションで変更できるようにする必要があると思います 私が使用しているタイプのジョイパッドの場合は Z が横方向( +:右 -:左 )、Rz が縦方向( +:下 -:上 ) Xbox360用コントローラのPC版は Rx が横方向( +:右 -:左 )、Ry が縦方向( +:下 -:上 ) Drileさんが使用されているジョイパッドの場合は Rz が横方向( +:右 -:左 )、Z が縦方向( +:下 -:上 ) という感じで・・・ どれだけパターンがあるのか分からないので面倒な作業になってしまいますが・・・
Re: ジョイパッドの右レバー入力情報の不具合 ( No.2 )
名前:Drile(解決) 日時:2011/07/12 16:59

なるほど、薄々そんな気がしていましたが、 やはりパッドの問題でしたか。 オプションで上下左右を識別させて・・・とすれば何とかなりそうな気もしますが、 そこまでして・・・感が否めないので、右スティックは未対応とすることにします。 ありがとうございました。
Re: ジョイパッドの右レバー入力情報の不具合 ( No.3 )
名前:げいつ関数 日時:2011/12/13 00:30

wsprintf(c) げいつ関数????????????
Re: ジョイパッドの右レバー入力情報の不具合 ( No.4 )
名前:きたああ 日時:2013/05/09 01:25

ありがとう、本当にありがとう!
Re: ジョイパッドの右レバー入力情報の不具合 ( No.5 )
名前: 日時:2015/12/10 16:53

Page: 1 |