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用で取得。
それ以外は古い市販コンのパターンで取得(違うパターンもあるかもですけど)。
という方法で行こうと思います。
お時間頂きありがとうございました!
|