ご報告ありがとうございます
ご迷惑おかけしてすいません、現在出回っている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 が縦方向( +:下 -:上 )
という感じで・・・
どれだけパターンがあるのか分からないので面倒な作業になってしまいますが・・・