トップページ > 記事閲覧
SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる
名前:とらふずく 日時: 2022/07/23 15:16

何度も質問をして申し訳ありません。 DXライブラリの掲示板に投稿する内容ではないかもしれませんが、何か心当たりがあれば回答して頂けないでしょうか。 ○経緯 DXライブラリで作成したゲームをSteamで販売しています。 そのゲームでSteamAPIを使って、Steam内でのランキング機能を実装しています。 ○現象 SteamAPIの初期化関数SteamAPI_Init()を呼び出すと、GetJoypadInputState等のPADに関する処理が何の値も返さなくなります。 https://partner.steamgames.com/doc/sdk/api?l=japanese SteamAPI_Initを呼ぶと、それ以降GetJoypadInputState等のPADに関数がすべて0で返ってきます。 後述の検証コードで呼んでいる関数はすべてすべて0で返ってきました。 SteamAPI_Initを呼ばなければ、GetJoypadInputState等のPADに関数は入力通りの値が返ってきます。 補足: キーボードの入力はSteamAPI_Initの呼び出しに関わらず、正常に値が返ってきます。 char buf[256]; GetHitKeyStateAll(buf); SteamAPIはSteamでアプリの登録をしないと呼び出せないので、管理人様にお伺いしても解決が難しいと思っています。 ですが、何か原因の心当たりや、アドバイス等ありましたら回答して頂けないでしょうか。 ○検証環境 Windows10 C++版 DXLib_Ver3.23 VisualStudio2019 ○検証コード void DXlibQA3() { SetGraphMode(1280, 720, 32); ChangeWindowMode(true); SetAlwaysRunFlag(TRUE); if (DxLib_Init() == -1) { return; } SetDrawScreen(DX_SCREEN_BACK); // SteamAPI初期化処理 SteamAPI_Init(); // これをコメントアウトすれば、正常に動作する DINPUT_JOYSTATE input; XINPUT_STATE input2; while (!ProcessMessage()) { ClearDrawScreen(); if ((GetJoypadInputState(DX_INPUT_PAD1) & PAD_INPUT_UP) == 0) { DrawString(100, 10, "押されていない", GetColor(255, 255, 255)); } else { DrawString(100, 10, "押されている", GetColor(255, 255, 255)); } // パッド1の入力を取得 int InputX, InputY; char String[64]; GetJoypadAnalogInput(&InputX, &InputY, DX_INPUT_KEY_PAD1); // 画面に入力状態を表示する { ClearDrawScreen(); wsprintf(String, "X = %d", InputX); DrawString(0, 100, String, GetColor(255, 255, 255)); wsprintf(String, "Y = %d", InputY); DrawString(0, 116, String, GetColor(255, 255, 255)); } // 入力状態を取得 GetJoypadDirectInputState(DX_INPUT_PAD1, &input); // 画面に構造体の中身を描画 int Color = GetColor(255, 255, 255); DrawFormatString(0, 200, Color, "X:%d Y:%d Z:%d", input.X, input.Y, input.Z); DrawFormatString(0, 216, Color, "Rx:%d Ry:%d Rz:%d", input.Rx, input.Ry, input.Rz); DrawFormatString(0, 232, Color, "Slider 0:%d 1:%d", input.Slider[0], input.Slider[1]); DrawFormatString(0, 248, Color, "POV 0:%d 1:%d 2:%d 3:%d", input.POV[0], input.POV[1], input.POV[2], input.POV[3]); DrawString(0, 264, "Button", Color); for (int i = 0; i < 32; i++) { DrawFormatString(64 + i % 8 * 64, 264 + i / 8 * 16, Color, "%2d:%d", i, input.Buttons[i]); } // 入力状態を取得 GetJoypadXInputState(DX_INPUT_PAD1, &input2); // 画面に XINPUT_STATE の中身を描画 Color = GetColor(255, 255, 255); DrawFormatString(0, 500, Color, "LeftTrigger:%d RightTrigger:%d", input2.LeftTrigger, input2.RightTrigger); DrawFormatString(0, 516, Color, "ThumbLX:%d ThumbLY:%d", input2.ThumbLX, input2.ThumbLY); DrawFormatString(0, 532, Color, "ThumbRX:%d ThumbRY:%d", input2.ThumbRX, input2.ThumbRY); DrawString(0, 64, "Button", Color); for (int i = 0; i < 16; i++) { DrawFormatString(64 + i % 8 * 64, 564 + i / 8 * 16, Color, "%2d:%d", i, input.Buttons[i]); } // 毎フレーム呼び出す必要あり SteamAPI_RunCallbacks(); ScreenFlip(); clsDx(); } } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { srand((unsigned)time(nullptr)); //乱数初期化 DXlibQA3(); return 0; }
メンテ

Page: 1 | 2 |

Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.13 )
名前:管理人(解決) 日時:2022/08/18 23:12

> ギウさん > すみません。仰る通り、通常は取得できず、 > ユーザーさんにSteamランチャーのゲーム毎の設定で「Steam入力を無効にする」を選んでもらわないとダメでした。 なるほど、そうだったのですね やはり Steam Input が有効になっていると駄目でしたか… (- -;;
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.14 )
名前:たろう 日時:2023/12/26 00:06

終わった話を横からすみません。 スチームで販売しているものに実績などをつけようかと考えているのですが 結論として、SteamAPIを使うとジョイパッドが 使えなくなってしまうことでしょうか? ゲーム自体が遊べなくなる不安定な要素が出来てしまうのであれば SteamAPIを使うのはやめておこうかとも思うのですが この問題は、現在もそのままでしょうか? 現状どういった対応が最善かなど 教えていただけるとありがたいですm(__)m ※以前、別のスレでお話させていただいた通り 謎のバグ回避のためSetUseDirectInputFlag(FALSE);を使ったうえで 振動無しの古い仕様?で、D-inputを受け付けて X-inputはもちろん普通の仕様で受け付けて使用しています。 いつも質問ばかりですみませんm(__)m よろしくお願いいたします。
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.15 )
名前:管理人 日時:2023/12/26 21:16

> 結論として、SteamAPIを使うとジョイパッドが > 使えなくなってしまうことでしょうか? GetJoypadInputState などが使用できなくなりますので、代わりに SteamInput を使用する必要があります > この問題は、現在もそのままでしょうか? 最新の環境で試してみましたが、そのままのようです > 現状どういった対応が最善かなど > 教えていただけるとありがたいですm(__)m 選択肢としては以下のようになると思います 1. 実績の実装を辞める 2. ギウさんの No.12 のご返信にありますように Steamランチャーの設定で「Steam入力を無効にする」を設定していただくようにプレイヤーに案内する 3. SteamInput を使用する処理を追加する 1 が最も簡単な選択肢です 2 は案内表示をするだけなので容易かと思います 3 は SteamInput の使い方を理解して処理を追加する必要があるので結構大変です 3つとも一長一短なので、どの選択肢が最善というのは無いと思います
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.16 )
名前:たろう 日時:2023/12/26 22:00

いつもありがとうございます。 とても勉強になりますm(__)m 例えばゲームクリアなど実績解除条件が揃ったらフラグを立てて保存しておいて 「ゲーム終了」などをユーザーが選んだ直後に SteamAPI_Init()を行って、すぐ実績をスチーム側に送り その後一切ユーザー操作が不要な形で DxLib_End();が呼ばれる仕組みにする ・・・といった方法は仕組み上問題ありそうでしょうか? 既に販売しているので変にいじっておかしくなりはしないかと 試すのも二の足を踏んでいますm(__)m 予測で構いません、アドバイスを頂ければと思います。 よろしくお願いいたしますm(__)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.17 )
名前:管理人 日時:2023/12/26 22:20

> 例えばゲームクリアなど実績解除条件が揃ったらフラグを立てて保存しておいて > 「ゲーム終了」などをユーザーが選んだ直後に > SteamAPI_Init()を行って、すぐ実績をスチーム側に送り > その後一切ユーザー操作が不要な形で > DxLib_End();が呼ばれる仕組みにする > ・・・といった方法は仕組み上問題ありそうでしょうか? 問題ないと思いますが、SteamAPI_Init() を呼ぶのは DxLib_Init() を呼ぶ前にしていたので、 DxLib_Init() を読んだ後に SteamAPI_Init() を呼んでも問題無いかは分かりません 寧ろ DxLib_End() を呼んだ後に SteamAPI_Init() を呼んで実績処理を行った方が良いかもしれません
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.18 )
名前:たろう(修正※追記) 日時:2023/12/27 00:29

ありがとうございますm(__)m なるほどです。 SteamAPIが使えないのはつらいですし かといって妙な使い方をするのも後々問題が発生するかもしれませんので 結局は(3)を試さないといけなそうですね。 勇気とやる気が揃ったら挑戦してみようと思います。 追加で、もう一つ質問をすみません。 ギウさんの(2)についてですが、 steamworksの アプリデータ/アプリケーション/Steam 入力 にある「Steam入力デフォルト設定」で ユーザー側に「Steam入力を無効にする」の選択を要求することなく デフォルトで無効に設定できないのでしょうか? もちろん試された上で出来ないという事だと思うのですが SteamランチャーのSteam入力を有効にするか無効にするかの設定項目に 「デフォルト設定を使用する」があるわけですから それができないとおかしいような気がするので 念の為お聞きしようと思いました。 よろしくお願いいたしますm(__)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.19 )
名前:管理人 日時:2023/12/27 02:59

> ギウさんの(2)についてですが、 > steamworksの > アプリデータ/アプリケーション/Steam 入力 > にある「Steam入力デフォルト設定」で > ユーザー側に「Steam入力を無効にする」の選択を要求することなく > デフォルトで無効に設定できないのでしょうか? >  > もちろん試された上で出来ないという事だと思うのですが > SteamランチャーのSteam入力を有効にするか無効にするかの設定項目に > 「デフォルト設定を使用する」があるわけですから > それができないとおかしいような気がするので > 念の為お聞きしようと思いました。 私が調べた限りではソフト側では無効にすることはできませんでしたが、 私が知らないだけでもしかしたら何か方法があるかもしれません よろしければ Steam のサポートに問い合わせてみてください m(_ _)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.20 )
名前:たろう(解決) 日時:2023/12/27 07:17

いつもありがとうございます すみません、よく考えたら完全にDxライブラリは 関係ない話でしたm(__)m また、お手数をおかけしてしまいました ありがとうございましたm(__)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.21 )
名前:たろう(解決) 日時:2024/01/19 00:28

steamの実績を追加したのですが、 スチーム経由で起動しても、実績の有効化も問題ありませんし 普通にX,D-inputとも、入力を認識出来ています 「Steam入力を無効にする」にもしておらず、全然普通です 管理人さんやギウさんと何が違うんでしょうか・・・ ご報告までm(__)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.22 )
名前:管理人(解決) 日時:2024/01/19 01:26

SteamAPI_Init() を呼んでも XInput も DirectInput も問題なく取得できるということでしょうか? もしそうなのだとしますと、何故たろうさんの環境では SteamAPI_Init() を呼んで、且つ 「Steam入力を無効にする」にしていなくても問題なく取得できているのかは私には分かりません… (・・;
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.23 )
名前:たろう(解決) 日時:2024/01/20 01:25

SteamAPI_Init()を呼んだうえで XInput も DirectInput も取得できています 実績獲得も出来ているので、APIも問題なく動作していると思います。 なんどもお手数をおかけしてすみません、もしまた何かわかりましたらまた書き込みます ありがとうございました。m(__)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.24 )
名前:Yoji Suzuki 日時:2024/02/08 18:51

DXライブラリを使っていないのですが、同じ問題(SteamAPI_Initを使うとDirectInput, XInputの入力ができなくなる問題)にエンカウントして、 原因調査する過程で本スレッドにたどり着きました。 私の場合、XInputとDirectInput8を直接使っているのですが、当初は(上述のたろう様と同様に)本件問題は最初は発生していなくて、 SteamAPI_Initを発行後も正常にDirectInputとXInput両方のコントローラが使用できていました。 ところが、ロジクールのF310というゲームパッドでテストをしたところ接続が認識できなかったため、 試しにF310のデバイスドライバ(Windows10用)をWindows11の環境にインストールしてしまったのですが、 それ以降 F310 だけでなく、以前は正常に動作していたXInputのゲームパッド(NintendoSwitchのプロコン)や DirectInputのゲームパッド(中国製)まで認識されなくなる現象に陥りました。 F310のデバイスドライバをアンインストールしても症状は改善せず、 デバイスマネージャでHID関連のドライバ再インストールを試したのですがそれでも症状は改善せず途方に暮れていたのですが、 本ページの情報を見つけて SteamAPI_Init を発行しないようにしてみたところ、 すべてのコントローラ(※F310を含む)が無事認識されるようになったことを確認しました。(ありがとうございます!) 要するに、本件問題は環境依存で発生したりしなかったりするものと思われます。 SteamAPI_Init発行以降に認識されなくなった原因を調査したところ、 (DirectInputのコントローラについては)DirectInput8のEnumDevicesで列挙されないことに起因していることが分かりました。 XInputは処理が隠蔽されているので原因はわかりません。 SteamInputも試してみたのですが、SteamInput()->GetConnectedControllersでゲームパッドが列挙されなかったので、 本件問題はSteamInputを使っても治らないかもしれません。 ※私のSteamInputの使い方がマズイかも...SteamInputのC++での使い方を解説しているドキュメントが無いので使い方がよく分かりません^^; 恐らく、ロジクールのデバイスドライバがインストールする WmBEnum.sys というシステムファイルが DirectInput と XInput の挙動に何か悪い影響を与えているのではないかと推測中ですが裏は取れてません。 Steamのアチーブメントを実装したいのですが、この問題のために対応を断念せざるを得ないかもと思っているところです。 (一応調査しているのですが暗礁に乗り上げつつあります...) Dxライブラリも恐らく私のプログラムと同じ原因だと考えられるのでご参考までに報告しておきました。 長々と失礼しました
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.25 )
名前:Yoji Suzuki 日時:2024/02/08 22:27

以下のように SteamAPI_Init を発行した後で SteamInput()->Shutdown を発行することでゲームパッドが認識できるようになるのでは? (SteamのUI上でSteamInputを無効にするのと恐らく等価)と思ったのですが、ダメでした。 ----- putlog("Initializing Steam..."); if (!SteamAPI_Init()) { putlog("SteamAPI_Init failed"); } else { this->initialized = true; if (!SteamUserStats()->RequestCurrentStats()) { putlog("SteamUserStats::RequestCurrentStats failed!"); } else { auto hdl = SteamUserStats()->FindLeaderboard("score_ranking_friend"); this->callResultFindLeaderboard.Set(hdl, this, &CSteam::onFindLeaderboard); } SteamInput()->Shutdown(); // コレを追加 } ----- 当初、上記で治ると勘違いしてしまったのですが、Steam UI上での設定がデバッグ環境でも効いているようで、 再度Steam UIでSteamInputを有効にしたところ症状は改善しませんでした... なお、SteamAPI_Initを呼び出さないようにしても、結局Steam UIからゲームを起動すると 内部的にSteamAPI_Init相当のことが実行されるようです。 つまり、SteamAPI_Initを呼ばなければ治るというものではないようです。 という訳で、ゲームの説明文でゲームパッドが認識されなかったらSteam入力を無効にする旨を記載するぐらいしか回避策は無さそうです。
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.26 )
名前:たろう 日時:2024/02/08 23:31

Suzukiさん、はじめまして、たろうです。 よろしければスチームのヘルプに状況を説明して 解決策を尋ねてはいただけないでしょうか? 私も別件で何度か質問しましたが、結構親切に回答をくれますから ゲームパッドを使用できないというのは大問題なので きっと回答を返してもらえるのではと思います。 私はいまだに全く問題なく使用できてしまっていますので、 質問に至っておらず、また知識も乏しいので 頂いた回答に対応できるかもわからないという 情けない状況です。 ※質問は日本語で全く問題ないです。 ※回答は英語だったり日本語だったりするようです m(__)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.27 )
名前:Yoji Suzuki 日時:2024/02/08 23:42

たろうさん、はじめまして。 スチームヘルプの件了解しました。 回答が得られたらこちらの掲示板でも情報共有します。
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.28 )
名前:たろう 日時:2024/02/09 00:20

ありがとうございますm(__)m もしDXライブラリ使用での問題と同じでなかったとしても 解決法は同じかもしれません、 いい結果が得られるといいですね!
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.29 )
名前:Yoji Suzuki 日時:2024/02/09 07:57

早速、スチームヘルプへは以下のような形で質問を投げてみました。 (この形で良い回答が得られればDXライブラリを使っているゲームでも有用かと思われたので) ※日本語で書いてdeeplで英訳した時の英文が自然になる形にしたので日本語では少し読みにくいかもしれません ----- 私のアプリはXInputとDirectInput8でゲームパッドを使用するゲームを開発しています。 そのゲームに接続可能なゲームパッドのテストを行ったとき、一部のPCではゲームパッドの 接続を認識できない問題を検出しました。 その原因について調査した結果、SteamAPI_Initを呼び出すとDirectInput8のEnumDevicesで ゲームパッドのデバイス情報が列挙されなくなることが分かりました。 そのPCでSteamAPI_Initの呼び出しをコメントアウトした状態に改造したゲームを実行すると EnumDevicesに列挙されることでゲームパッドの接続を認識できることを確認しました。 SteamAPI_Initを呼び出していても正常にEnumDevicesでゲームパッドのデバイス情報が列挙 できるPCも存在します。 なお、どちらのPCもOSはWindows11です。 より正確には、列挙できないPCは、以前は正常に列挙ができていたのですが、 ロジクール(ロジテック)のF310というゲームパッドのデバイスドライバをインストール したことを契機に列挙できなくなりました。 つまり、本件問題はロジクールのデバイスドライバのバグだろうと推測しています。 私は現在、この問題を回避するアイディアを検討しています。 ただし、私のゲームではSteamのアチーブメント機能を使いたいため、 SteamAPI_Initを呼び出さないという選択肢は無いです。 私が発見した唯一の回避策は、SteamのUI上で「SteamInputを無効」にしてからゲームを 起動するというものです。 SteamInputを無効にすることで、問題が起きるPCでも正常にEnumDevicesでゲームパッド のデバイス情報が列挙できるようになることを確認しました。 ただし、SteamInputはデフォルトで有効になっていると思われるので、ゲームを販売した時、 同じ問題にエンカウントする購入者が出てくることを懸念しています。 そこで、SteamAPI_Initを実行した直後に SteamInput()->Shutdown() を実行するように してみたのですが、そのように実装しても「SteamInputを有効」の状態でゲームを起動すると 不具合を回避できませんでした。 恐らく、SteamAPI_Initでは内部的にSteamInput()->Init を呼び出しているものと思われますが、 これを回避しなければ Shutdown しても現象を回避できないため、「SteamInputを有効」の状態 だとSteamInput()->Shutdown()を実行しても効果が無いものと考えられます。 ロジクールがバグを対策してくれることがベストですがそれは期待することができないため、 私のゲームのSteamでのデフォルト設定を「SteamInputを無効」にできればそれがベターだと考えています。 もしもそのようにする手段があれば教えていただきたいです。 -----
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.30 )
名前:たろう 日時:2024/02/09 21:47

ありがとうございます。多分私のゲームも人によってはプレイできなくなっているんですね。 ユーザーがほぼいないので、それにも気づく事が出来ず全く情けない限りです。 回答は長い時は5日くらいかかったと思いますが、そんな私のゲームでも 毎回適切な回答を頂けたので期待できると思いますm(__)m
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.31 )
名前:Yoji Suzuki 日時:2024/02/14 11:31

Steamヘルプから回答が来ました。 > I have a Logitech F310 here and haven't had any problems with it. > Does the controller work in the Steam controller settings "Test Device Inputs"? とのことだったので、問題が発生していた環境で Steam クライアントを Big Picture モードに切り替え コントローラーの入力テストを実行してみたところ、 問題のコントローラーで問題なく入力テストができている状態でした。 入力テストの後、私のゲームを SteamInput を有効にした状態にして起動してみたところ、 SteamInput が有効な状態でも正常にコントローラーの入力ができることを確認。 つまり、先日まで発生していた現象が再現できない状態になりました^^; 何か一時的な問題でPCがおかしくなっていただけなのかもしれません。 OS アップデートは走っていなかったと思います。 Steam のアップデートは一度降ってきたのでそれで治った可能性があるかもしれません。 その他に関係しそうな操作としては、問題の PC の Steam クライアントでは Big Picture モードを初めて起動したことぐらいかな? (それが影響するのかはよく分かりませんが...) ひとまず、現象が再現できなくなった以上、Steamヘルプは解決済みでクローズしました。 あまり参考にならず申し訳ありませんが、何かの参考になれば幸いです。
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.32 )
名前:たろう 日時:2024/02/14 17:00

Suzukiさん、私の一言で大変お手数をおかけしてしまいまた。 Suzukiさんの問題はひとまず解決したようで、 その点だけでも良かったです。 となるとDXライブラリ使用での問題とは違ったのかもしれませんね もしくは近いのかもしれませんが、 DXライブラリを使用して同じ問題に遭遇して困っている方は Steamヘルプは日本語OKですし、かなり親切ですので、 尋ねてみていただければと思います。 m(__)m
メンテ

Page: 1 | 2 |

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

   クッキー保存