トップページ > 記事閲覧
コントローラについて
名前:ギウ 日時: 2021/12/02 21:36

いつもお世話になっております。 右スティックのアナログ値は、 GetJoypadDirectInputState で取得するで合ってるでしょうか。 XBoxコントローラなら問題なく取得できるのですが、PS4用のコントローラだと、何も押してないのに Rx=-1000 になるなど、取得できませんでした。 これはこちらのコントローラの問題でしょうか、それとも、どうにもならない問題でしょうか。 もしどうにもならない場合、Rx,Ry,Rzの値を全て0にすることは可能でしょうか。 現状だと、押してるから-1000なのか、取得できなくて-1000なのかがわからないので。 ご確認お願いいたします。
メンテ

Page: 1 |

Re: コントローラについて ( No.1 )
名前:ギウ 日時:2021/12/03 09:52

(追記) どうしても値が不定になる場合は、下記にあった GetJoypadType でPS4系かを調べて、PS4系なら右スティックを無効化しようと思います。
メンテ
Re: コントローラについて ( No.2 )
名前:sereparu 日時:2021/12/03 17:28

PS4のコントローラのGetJoypadDirectInputStateの各値は以下のように設定されています。 X … 左スティックのX軸の入力値(押していない状態 = 0、左 = -1000、右 = 1000) Y … 左スティックのY軸の入力値(押していない状態 = 0、上 = -1000、下 = 1000) Z … 右スティックのX軸の入力値(押していない状態 = 0、左 = -1000、右 = 1000) Rx … L2ボタンの入力値(押していない状態 = -1000、最大まで押し込んだ状態 = 1000) Ry … R2ボタンの入力値(押していない状態 = -1000、最大まで押し込んだ状態 = 1000) Rz … 右スティックのY軸の入力値(押していない状態 = 0、上 = -1000、下 = 1000) なので、何も押していないのにRx = -1000 になるのは正常です。 PS4 コントローラーでは上記の設定ですが DirectInput製のゲームパッドは、メーカーによってアナログ入力値を X、Y、Z、Rx、Ry、Rz のどれに割り当てるかの基準がバラバラなので DirectInputはアナログ入力を使用するゲームの開発には不向きかもしれません。 市販のゲームもXInputのみ対応のゲームが多いような気がします。
メンテ
Re: コントローラについて ( No.3 )
名前:ギウ 日時:2021/12/03 22:38

ご指摘ありがとうございます! なるほど、仰る通りパッドによって反応する場所がバラバラでした。 一応、すべてのボタンを取得できましたので、あとはGetJoypadTypeで切り替えれば行けそうと思ったのですが、 試したところ、  PS4 = 2:DX_PADTYPE_XBOX_ONE  XBoxOne = 2:DX_PADTYPE_XBOX_ONE  市販コン = 2:DX_PADTYPE_XBOX_ONE という感じで全て XboxOne という判定になりました。
メンテ
Re: コントローラについて ( No.4 )
名前:ギウ 日時:2021/12/03 22:52

PS4に関しては、sereparuさんの書き込みの通り、 >Rx … L2ボタンの入力値(押していない状態 = -1000、最大まで押し込んだ状態 = 1000) >Ry … R2ボタンの入力値(押していない状態 = -1000、最大まで押し込んだ状態 = 1000) デフォルトが-1000なので、敢えて最初から押しっぱなしにしてなければ判定できそうですね。
メンテ
Re: コントローラについて ( No.5 )
名前:管理人 日時:2021/12/04 00:40

>  PS4 = 2:DX_PADTYPE_XBOX_ONE >  XBoxOne = 2:DX_PADTYPE_XBOX_ONE >  市販コン = 2:DX_PADTYPE_XBOX_ONE >  > という感じで全て XboxOne という判定になりました。 XInput に対応している市販コンが XboxOne 判定される可能性はありますが、 XInput に対応していない PS4コントローラが XboxOne 判定されるのはおかしいですね… すみません、最新版のDXライブラリで実行した際の Log.txt の内容を貼り付けて頂けないでしょうか? コントローラに関するログ出力をかなり詳細に行っていますので、原因が何かがわかると思いますので… m(_ _;m
メンテ
Re: コントローラについて ( No.6 )
名前:ギウ 日時:2021/12/04 08:14

>管理人様 了解です。Logで関係ありそうなとこを貼ります。 DXライブラリは、Ver 3.23 です。 <PS4コントローラ> ※判定=DX_PADTYPE_XBOX_ONE 3623: パッドの数は 1 個です 3624: 入力関連の初期化をしました 3631: WASAPI の初期化を行います 3648: デバイス名 : ヘッドセット イヤフォン (Wireless Controller) 3655: デフォルト遅延時間 : 10.000 ms 3655: 最小遅延時間 : 3.000 ms 3655: 遅延時間 : 10.000 ms 3657: チャンネル数   : 2 ch 3658: 量子化ビット深度 : 32 bit 3658: 有効ビット深度  : 0 bit 3659: サンプリングレート : 32000 Hz 3659: データ形式 : 整数型 3683: 動作モード : 共有モード 3683: WASAPI の初期化は正常に終了しました <Switch用コントローラ(非正規品)> ※XBoxOneと同じで(Rx,Rz)がRスティック ※判定=DX_PADTYPE_XBOX_ONE 1064: パッドの数は 1 個です 1064: 入力関連の初期化をしました 1067: WASAPI の初期化を行います 1079: デバイス名 : スピーカー (Realtek(R) Audio) 1318: デフォルト遅延時間 : 10.000 ms 1319: 最小遅延時間 : 3.000 ms 1319: 遅延時間 : 10.000 ms 1320: チャンネル数   : 2 ch 1320: 量子化ビット深度 : 32 bit 1321: 有効ビット深度  : 32 bit 1321: サンプリングレート : 48000 Hz 1321: データ形式 : 浮動小数点型 1368: 動作モード : 共有モード 1368: WASAPI の初期化は正常に終了しました <Switch用コントローラ(正規品)> ※PCが対応していないのか無反応でした。USB接続。 ※判定=DX_PADTYPE_XBOX_ONE 1331: パッドの数は 2 個です 1332: 入力関連の初期化をしました 1335: WASAPI の初期化を行います 1347: デバイス名 : スピーカー (Realtek(R) Audio) 1596: デフォルト遅延時間 : 10.000 ms 1597: 最小遅延時間 : 3.000 ms 1597: 遅延時間 : 10.000 ms 1598: チャンネル数   : 2 ch 1599: 量子化ビット深度 : 32 bit 1599: 有効ビット深度  : 32 bit 1599: サンプリングレート : 48000 Hz 1599: データ形式 : 浮動小数点型 1611: 動作モード : 共有モード 1611: WASAPI の初期化は正常に終了しました <XBoxOne用コントローラ> ※判定=DX_PADTYPE_XBOX_ONE 1140: パッドの数は 1 個です 1140: 入力関連の初期化をしました 1144: WASAPI の初期化を行います 1158: デバイス名 : スピーカー (Realtek(R) Audio) 1386: デフォルト遅延時間 : 10.000 ms 1387: 最小遅延時間 : 3.000 ms 1387: 遅延時間 : 10.000 ms 1389: チャンネル数   : 2 ch 1389: 量子化ビット深度 : 32 bit 1389: 有効ビット深度  : 32 bit 1389: サンプリングレート : 48000 Hz 1389: データ形式 : 浮動小数点型 1403: 動作モード : 共有モード 1403: WASAPI の初期化は正常に終了しました <市販のコントローラ(かなり古いやつ)> ※Rスティックは(z,Rz)で取得。デフォルト値は0。 ※判定=DX_PADTYPE_XBOX_ONE 1369: パッドの数は 1 個です 1369: 入力関連の初期化をしました 1376: WASAPI の初期化を行います 1390: デバイス名 : スピーカー (Realtek(R) Audio) 1646: デフォルト遅延時間 : 10.000 ms 1647: 最小遅延時間 : 3.000 ms 1647: 遅延時間 : 10.000 ms 1651: チャンネル数   : 2 ch 1651: 量子化ビット深度 : 32 bit 1652: 有効ビット深度  : 32 bit 1652: サンプリングレート : 48000 Hz 1653: データ形式 : 浮動小数点型 1668: 動作モード : 共有モード 1668: WASAPI の初期化は正常に終了しました という感じです。全てUSB接続です。全てDX_INPUT_PAD1で取得。 最後の市販コンは無視して良いかなと思います。 大きく分けると、PS4型かXBoxOne型になるでしょうか?
メンテ
Re: コントローラについて ( No.7 )
名前:管理人 日時:2021/12/05 07:15

ログの貼り付けありがとうございます ただ、すみません、載せていただいた箇所は WASAPI というサウンド出力に関する部分となります 入力に関係のあるところのみとなりますと、以下のような『DirectInput関係初期化処理』から 『DirectInput 関連の初期化は正常に終了しました』までの出力部分になります… ( XboxOne コントローラを接続して起動した場合 ) 535: DirectInput関係初期化処理 537: XInput DLL の読み込み中... 成功 551: DirectInput8 の取得を試みます...成功 610: 引き続き初期化処理... 初期化成功 619: ジョイパッドの初期化... 622: XInput 対応コントローラーのチェックを開始します 625: XInput 対応コントローラー No.0 をチェック 636: XInput 対応コントローラー No.0 の接続を確認しました 639: XInput 対応コントローラー No.0 を入力ナンバー 0 で登録します 642: XInput 対応コントローラー No.1 をチェック 645: XInput 対応コントローラー No.1 の接続は確認できませんでした 649: XInput 対応コントローラー No.2 をチェック 651: XInput 対応コントローラー No.2 の接続は確認できませんでした 654: XInput 対応コントローラー No.3 をチェック 657: XInput 対応コントローラー No.3 の接続は確認できませんでした 662: XInput 対応コントローラーのチェック完了 665: DirectInput 対応ジョイパッドの列挙を開始します 682: DirectInput 対応入力装置を検出しました 685: Device Product GUID : 02ff045e,0000,0000,00,00,50,49,44,56,49,44 688: Device Instance GUID : a4d12640,2c78,11eb,80,01,44,45,53,54,00,00 691: DirectInputDevice8 の作成... 成功 699: DirectInputDevice の情報を取得します... 成功 706: Device Product Name : Controller (Xbox One For Windows) 709: Device Instance Name : Controller (Xbox One For Windows) 713: 検出した DirectInput 対応入力装置が Xbox360コントローラーか確認... 不一致 720: 検出した DirectInput 対応入力装置が XboxOneコントローラーか確認... 一致 728: 検出した DirectInput 対応入力装置の初期化を中断します 731: DirectInput 対応ジョイパッドの列挙終了 734: ジョイパッドの初期化は正常に終了しました 738: マウスデバイスの初期化... 初期化成功 745: キーボードデバイスの初期化... 初期化成功 758: DirectInput 関連の初期化は正常に終了しました > 大きく分けると、PS4型かXBoxOne型になるでしょうか? ”大きく分ける”となりますと、XInput に対応しているか、DirectInput のみに対応しているか、の分類になると思います
メンテ
Re: コントローラについて ( No.8 )
名前:ギウ 日時:2021/12/05 09:40

なるほど、 Log.txt にも VisualStudioの出力にもそういう情報は出てないです。 (SetOutApplicationLogValidFlag も実行してないです) もしかしてジョイパッド用の初期化関数があったりしますか? GetJoypadXInputState は全てのパッドで 0 が返ってきます。(PC自体が対応してないとか? 今年買ったVaioを使ってます)
メンテ
Re: コントローラについて ( No.9 )
名前:ギウ 日時:2021/12/05 09:43

(補足) >GetJoypadXInputState は全てのパッドで 0 が返ってきます。 エラーは返ってこないけど、XINPUT_STATEに値が無い状態です。
メンテ
Re: コントローラについて ( No.10 )
名前:管理人 日時:2021/12/05 11:37

> もしかしてジョイパッド用の初期化関数があったりしますか? いえ、ジョイパッド用の初期化関数はありません すみません、以下のような初期化して終了するだけのプログラムでもログ『DirectInput関係初期化処理』の 出力がされませんでしょうか? #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } もし出力されませんでしたら、やはり Log.txt に何か原因究明に繋がるような出力があるかもしれませんので、 申し訳ありませんが Log.txt 全体を貼り付けて頂けないでしょうか? m(_ _)m
メンテ
Re: コントローラについて ( No.11 )
名前:ギウ(解決) 日時:2021/12/05 16:38

申し訳ありません! こちらのミスでした。 ============= // デバッグモードで重くなるのを回避する用 SetUseDirectInputFlag(FALSE); ============= というのが入っていた為、XInputが使えなかったようです。 (コメントのせいで関数名を見落としていました。今はデバッグモードで重くなることもなかったです) 上記を消したところ、GetJoypadType で正しい値を取得できました。 また、PS4と古い市販コン以外はXInputに対応していました。 なのでパッド値取得処理は、  XInputに対応していればそれで取得。   非対応でPS4系なら、PS4用で取得。    それ以外は古い市販コンのパターンで取得(違うパターンもあるかもですけど)。 という方法で行こうと思います。 お時間頂きありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存