Xbox360用コントローラーを使用した際に過去のバージョンから予期せぬ動作に変化しており、
正常な動作を期待できなくなってしまった事を報告いたします。
DXライブラリ Ver3.05の動作が期待される正常な動作と想定しています。
Xbox360用コントローラーに用いたドライバは公式の物と非公式の物を使用しました。
また、使用したコントローラーは有線の物です。
ttp://www.xbox.com/ja-JP/xbox360/accessories/controllers/xbox360controllerliquidblack
非公式ドライバはこちらのものを使用しています。
ttp://lavendy.net/special/driver/
比較用に使用したその他パッドは以下の物を専用ドライバをインストールせずに使用しました。
ttp://www2.elecom.co.jp/peripheral/gamepad/jc-ps102u/
下記に記載したコードを実行した所、以下のような結果が得られました。
実行に使用したOSはWindows7 64bitです。
・DXライブラリ Ver3.10e(最新版) + 公式ドライバ
パッドは認識する。
GetJoypadNameはエラーを返す。
GetJoypadDirectInputStateは正常に取得できる。
・DXライブラリ Ver3.10e(最新版) + 非公式ドライバ
パッドが認識しない。
コメントアウトしているSetUseDirectInputFlag(FALSE)を有効にすることで認識はするが
GetJoypadNameはエラーを返し、GetJoypadDirectInputStateも一部分しか情報を得られない。
・DXライブラリ Ver3.10e(最新版) + その他パッド
パッドは認識する。
GetJoypadNameは正常に取得できる。
GetJoypadDirectInputStateは正常に取得できる。
・DXライブラリ Ver3.05
全ての組み合わせ(公式、非公式、その他パッド)においてパッドは認識する。
GetJoypadNameは正常に取得できる。
GetJoypadDirectInputStateは正常に取得できる。
●使用したコード
#include "DxLib.h"
// プログラムは WinMain から始まります
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow )
{
//DirectInputを使わない
//SetUseDirectInputFlag(FALSE);
ChangeWindowMode(TRUE);
if( DxLib_Init() == -1 ){ // DXライブラリ初期化処理
return -1 ; // エラーが起きたら直ちに終了
}
//使用するPADID
int useid=1;
bool rapidkey[2]={false,false};
// メッセージループに代わる処理をする
while( ProcessMessage() == 0 ){
//初期化
SetDrawScreen(DX_SCREEN_BACK);
clsDx();
//左右切り替え
if(CheckHitKey(KEY_INPUT_LEFT)){
if(!rapidkey[0])--useid;
rapidkey[0]=true;
}else{
rapidkey[0]=false;
}
if(CheckHitKey(KEY_INPUT_RIGHT)){
if(!rapidkey[1])++useid;
rapidkey[1]=true;
}else{
rapidkey[1]=false;
}
//上限下限セット
useid=min(16,max(1,useid));
//使用するパッドIDをキーボードから
printfDx("JoypadNum:%d\n",GetJoypadNum());
printfDx("CheckID:%d\n\n",useid);
//パッドの名前を得る
char jname[2][256]={"\0","\0"};
int result=GetJoypadName(useid,jname[0],jname[1]);
if(result==0){
printfDx("InstanceName:%s\n",jname[0]);
printfDx("ProductName:%s\n",jname[1]);
}else{
printfDx("NONE!\n");
}
printfDx("%d",result);
//パッドの入力を得る
DINPUT_JOYSTATE input;
if(GetJoypadDirectInputState(useid,&input)==0){
printfDx("X:%d\n",input.X);
printfDx("Y:%d\n",input.Y);
printfDx("Z:%d\n",input.Z);
printfDx("Rx:%d\n",input.Rx);
printfDx("Ry:%d\n",input.Ry);
printfDx("Rz:%d\n",input.Rz);
printfDx("Slide[0]:%d\n",input.Slider[0]);
printfDx("Slide[1]:%d\n",input.Slider[1]);
for(int i=0;i<4;++i)printfDx("POV%d:%d\n",i+1,input.POV[i]);
printfDx("Button:");
for(int i=0;i<32;++i)printfDx("%d",input.Buttons[i]? 1:0);
}else{
printfDx("NONE!\n");
}
//画面更新
ScreenFlip();
ClearDrawScreen();
}
DxLib_End() ; // DXライブラリ使用の終了処理
return 0 ; // ソフトの終了
}
・追記
もし可能であるならばXInputへの対応をお願いします。
現状の公式ドライバはDirectInputの物ですとLT/RTがZ軸に割り当てられており同時使用が出来ない為です。