トップページ > 記事閲覧
Xbox360用コントローラーの動作について
名前:Aquid 日時: 2013/08/05 01:19

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軸に割り当てられており同時使用が出来ない為です。
メンテ

Page: 1 |

Re: Xbox360用コントローラーの動作について ( No.1 )
名前:管理人 日時:2013/08/08 23:19

ご情報ありがとうございます、正常に動作するように修正しましたので、 よろしければお試しになってみてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 現在のバージョンでは Ver3.05 の頃とは異なり Xbox360コントローラは XInput で、 それ以外のゲームパッドは DirectInput で入力を取得するようにしているのですが、 Xbox360コントローラは XInput でも DirectInput でも検出されてしまうので、DirectInput では Xbox360コントローラの名前のデバイスが検出されたら弾くようにしていました そして、非公式ドライバの場合 XInput は Xbox360コントローラを検出しないのですが、 公式ドライバと同じデバイス名を返します、DirectInput のデバイス検出処理では前述の通り 「Xbox360コントローラの名前のデバイスを弾く」ので、結果 XInput でも DirectInput でも 認識されない( DirectInput 側では検出されるけどDXライブラリの処理で弾いている )、 という事態になってしまっていました 今回の変更は DirectInput の処理「Xbox360コントローラの名前のデバイスを弾く」に 「XInput でコントローラが検出されていたら」という条件を加えました あと、GetJoypadName は DirectInput の機能を使用して取得できる文字列を返す関数だったので XInput で認識された場合はエラーを返していましたが、XInput で認識された場合も DirectInput で認識されたときに取得できる名前を返すように処理を変更しました
メンテ
Re: Xbox360用コントローラーの動作について ( No.2 )
名前:管理人 日時:2013/08/09 01:22

追記先ほど見ました XInput から取得できる情報をほぼそのまま取得するための関数を追加しましたので よろしければお使いください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) // XInput から得られる入力デバイス( Xbox360コントローラ等 )の生のデータを取得する // ( XInput非対応のパッドの場合はエラーとなり -1 を返す、 // DX_INPUT_KEY や DX_INPUT_KEY_PAD1 など、キーボードが絡むタイプを InputType に渡すとエラーとなり -1 を返す ) int GetJoypadXInputState( int InputType, XINPUT_STATE *XInputState ) ; // XInput のジョイパッド入力情報 struct XINPUT_STATE { unsigned char Buttons[ 16 ] ; // ボタン16個( 添字には XINPUT_BUTTON_DPAD_UP 等を使用する、0:押されていない 1:押されている ) unsigned char LeftTrigger ; // 左トリガー( 0〜255 ) unsigned char RightTrigger ; // 右トリガー( 0〜255 ) short ThumbLX ; // 左スティックの横軸値( -32768 〜 32767 ) short ThumbLY ; // 左スティックの縦軸値( -32768 〜 32767 ) short ThumbRX ; // 右スティックの横軸値( -32768 〜 32767 ) short ThumbRY ; // 右スティックの縦軸値( -32768 〜 32767 ) } ; // XInputボタン入力定義 #define XINPUT_BUTTON_DPAD_UP (0) // デジタル方向ボタン上 #define XINPUT_BUTTON_DPAD_DOWN (1) // デジタル方向ボタン下 #define XINPUT_BUTTON_DPAD_LEFT (2) // デジタル方向ボタン左 #define XINPUT_BUTTON_DPAD_RIGHT (3) // デジタル方向ボタン右 #define XINPUT_BUTTON_START (4) // STARTボタン #define XINPUT_BUTTON_BACK (5) // BACKボタン #define XINPUT_BUTTON_LEFT_THUMB (6) // 左スティック押し込み #define XINPUT_BUTTON_RIGHT_THUMB (7) // 右スティック押し込み #define XINPUT_BUTTON_LEFT_SHOULDER (8) // LBボタン #define XINPUT_BUTTON_RIGHT_SHOULDER (9) // RBボタン #define XINPUT_BUTTON_A (10) // Aボタン #define XINPUT_BUTTON_B (11) // Bボタン #define XINPUT_BUTTON_X (12) // Xボタン #define XINPUT_BUTTON_Y (13) // Yボタン
メンテ
Re: Xbox360用コントローラーの動作について ( No.3 )
名前:Aquid(解決) 日時:2013/08/10 06:17

無事非公式ドライバでの動作及び公式ドライバのXInputによる動作が出来ました。 ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存