トップページ > 過去ログ > 記事閲覧
ウィンドウズパッド専用DLL(C#)
名前:カメオライリー 日時: 2012/07/03 09:34

XNAでウィンドウズ用で制作したゲームは、 Xパッドでしか対応していなくて困っています。 フリーでそういったライブラリはいくつかみつけましたが、どっちかのパッドができなくなるとか、設定しづらいとかあって困っています。 こちらの過去ログで、XNA+DXでジョイパッド使用はありましたが、XNA4.0ではうまくいきませんでした。 あつかましくてすみませんが、 いっそのこと、XNA用Windows用パッド専用ライブラリを作っていただけないでしょうか?

Page: 1 |

Re: ウィンドウズパッド専用DLL(C#) ( No.1 )
名前:softya(ソフト屋) 日時:2012/07/03 10:45

ここで頼むのは筋違いだと思いますが、DXライブラリの管理人さんもDXライブラリとしても両方に対応する気はないと言うことです。 hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2679
Re: ウィンドウズパッド専用DLL(C#) ( No.2 )
名前:カメオライリー 日時:2012/07/05 07:01

softya(ソフト屋)さんちょっと意味が違います。 hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=past&no=1365 過去ログでありましたが、 これの動作がうまくいきません。 この動作は、XNAバージョン3.1でしょうか?
Re: ウィンドウズパッド専用DLL(C#) ( No.3 )
名前:レンタッカ 日時:2012/07/05 13:14

私が動かしたときは3.1でしたねw
Re: ウィンドウズパッド専用DLL(C#) ( No.4 )
名前:カメオライリー 日時:2012/07/07 01:07

動作しました。 360パッドが刺しっぱなしだと反応しないようです。 コードが埋もれていて別の器械がつながっていると勘違いしていたのが原因でした。 Xパッドを持っていない人にも渡すことはできてありがたいです。 以下のことが分かりました。 XパッドとWパッド両方刺しているとWパッドは反応しないが、XパッドのXNAクラスは反応する 動作途中からパッドを刺すと反応しない DX_INPUT_KEY_PAD1・・>キーが反応しない だけど、1つのソフトで両パッド対応できるので便利です。
Re: ウィンドウズパッド専用DLL(C#) ( No.5 )
名前:カメオライリー 日時:2012/07/07 14:11

さらに確認したところ、誤認していた点もありました。 WパッドとXパッドが刺さっていると、Wパッドが2Pになり、XパッドもDXライブラリで検査できます。 ただし、XパッドをDXライブラリで検査する場合、 Dパッド(十字キー)、右スティック、LT、RT が認知しません。 でもゲームによっては問題ないでしょう。 (値の整合性はチェックしていないです) 今度は、刺さっているジョイパッドが認知できません。ブレークポイントを設定して文字列らしき配列の内容を見ても、0ばかりでした。 var name1 = new System.Text.StringBuilder(); var name2 = new System.Text.StringBuilder(); DX.GetJoypadName(DX.PAD_INPUT_1, name1, name2); 困っています。
Re: ウィンドウズパッド専用DLL(C#) ( No.6 )
名前:カメオライリー 日時:2012/07/07 14:25

自己解決しました。 間違えでした! DX.PAD_INPUT_1    間違い   ↓↓ DX.DX_INPUT_PAD1   正しい 気づくまではまりました。名前が非常に似ているのでソース視認が遅れてしまいました。 こんな単純なミスだったとは・・・ 海外製のXNA用WindowsパッドライブラリよりもDXライブラリのほうが両対応と言うことでは優秀です。 Xパッドで反応しない場所が4箇所あるので、 もし可能ならば、修正いただけるとありがたいです。
Re: ウィンドウズパッド専用DLL(C#) ( No.7 )
名前:管理人 日時:2012/07/08 17:30

Xパッドの十字キーは GetJoypadDirectInputState という関数で状態を取得することができます // DirectInput から得られるジョイパッドの生のデータを取得する // ( DX_INPUT_KEY や DX_INPUT_KEY_PAD1 を引数に渡すとエラー ) int GetJoypadDirectInputState( int InputType, DINPUT_JOYSTATE *DInputState ) ; 引数に渡す構造体 DINPUT_JOYSTATE は次のように定義されています 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 になる ) } ; Xパッドの十字キーは POV[ 0 ] に割り当てられているようです こちらに GetJoypadDirectInputState で得られるパラメータをそのまま画面に表示するだけの サンプルを載せますので、よろしければ Xパッドの各入力がどのパラメータに割り当てられているか ご確認になってみてください #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 ] ) ; } DrawFormatString( 0, 256, GetColor( 255,255,255 ), "InputState %d", GetJoypadInputState( DX_INPUT_PAD1 ) ) ; // 裏画面の内容を表画面に反映 ScreenFlip(); } // DXライブラリの後始末 DxLib_End(); // ソフトの終了 return 0; } 因みに Xパッドは1種類なので Xパッドの入力に対応すればすべての Xパッドで 正常に入力を取得することができますが、Wパッドは十字キーとボタン以外の アナログスティックなどやアナログボタンなどの特殊入力は製品によって 割り当てられているパラメータが違うので注意してください ( 例としては、ある製品での左スティックの X軸はメンバ変数の Z に、Y軸は Rx に割り当てられているけど、別の製品では X軸は Rx、Y軸は Ry に割り当てられている等 )
Re: ウィンドウズパッド専用DLL(C#) ( No.8 )
名前:カメオライリー 日時:2012/07/09 20:41

まさかサンプルソース付きでこんなに分かりやすい回答いただけるとは思っていませんでした。 恐縮です。 Xパッドは特殊なので、 DX.GetJoypadName( でチェックして分岐させようかと考えております。 ありがとうございます。

Page: 1 |