トップページ > 記事閲覧
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 |

Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.1 )
名前:とらふずく 日時:2022/07/23 19:18

情報追記です SteamAPIの中にインプットを司るAPIがあるようです。これが入力を奪っている可能性がありそうだなと思いました。 止める方法がないか調べています。 ttps://partner.steamgames.com/doc/features/steam_controller
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.2 )
名前:ギウ 日時:2022/07/24 06:25

私の場合、 GetJoypadXInputStateで取得してみて、失敗したら GetJoypadDirectInputState で取得するようにしてます。 どちらかでSteamでも取得できていますのでお試しくださいませ。
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.3 )
名前:管理人 日時:2022/07/24 07:16

> ギウさん > どちらかでSteamでも取得できていますのでお試しくださいませ。 本当ですか…!? 私は Steam上ではDXライブラリの入力関数では取得できないと思い込んで Steam Input での取得処理と、ユーザーが Steam Input を無効化している場合用に GetJoypadXInputState や GetJoypadDirectInputState を使った取得処理のどちらも書いて対応しました… orz ( 開発をお手伝いさせていただいている ASTLIBRA Revision にて )
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.4 )
名前:とらふずく 日時:2022/07/24 13:02

> GetJoypadXInputStateで取得してみて、失敗したら GetJoypadDirectInputState で取得するようにしてます。 ギウさん情報ありがとうございます。 私の最初の投稿の検証コードで記載したとおりGetJoypadXInputStateとGetJoypadDirectInputStateでも入力を取得できませんでした。 私のコードに何か不足があれば教えて頂けないでしょうか。 > Steam Input での取得処理と、ユーザーが Steam Input を無効化している場合用に > GetJoypadXInputState や GetJoypadDirectInputState を使った取得処理のどちらも書いて対応しました… orz 「Steam Input での取得処理と、ユーザーが Steam Input を無効化」する方法を教えて頂けないでしょうか。 APIリファレンスを読んでみて、以下を試してみましたがダメで、他に方法が見つけれなかったため。 SteamAPI_Init(); SteamInput()->Shutdown();
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.5 )
名前:管理人 日時:2022/07/25 00:03

> 「Steam Input での取得処理と、 Steam Input での入力取得の方法についてはとらふずくさんも載せられたこちらのURLから見れる一連のページ <Steam入力> https://partner.steamgames.com/doc/features/steam_controller に書かれていますので、目を通してみて下さい ( 私も実装したのが1年以上前なので、かなり忘れてしまいました… ) > ユーザーが Steam Input を無効化」する方法を教えて頂けないでしょうか。 ユーザー( ゲームのプレイヤー )が Steam Input を無効化する方法は、Steam の Big Picture を起動して 設定画面から『コントローラ設定』を選択すると  PlayStation 設定サポート  Xbox 設定サポート  Switch Proの設定をサポート  Nintendoボタンレイアウトを使用  一般ゲームパッド設定サポート ↑ 上記のようなチェックボックス付きのリストが表示されますので、全部のチェックを外すと Steam Input を無効化できます > APIリファレンスを読んでみて、以下を試してみましたがダメで、他に方法が見つけれなかったため。 > SteamAPI_Init(); > SteamInput()->Shutdown(); 私も探してみましたが、プログラムで Steam Input を無効化する方法は見つけられませんでした (- -;
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.6 )
名前:とらふずく(解決済み) 日時:2022/07/25 23:51

管理人さんありがとうございます! Steamインプットの使い方、無効化のやり方理解出来ました。 私も管理人さんと同じやり方にするか、要検討したうえで対応しようと思います。 解決とさせて頂きます。
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.7 )
名前:とらふずく 日時:2022/07/26 00:51

解決済みにしましたが、もう1点確認させてもらえないでしょうか。 SteamAPIを使用する理由が、Steamのランキングに対応するためです。 ですので、ランキングへのアップロード、ダウンロードが終わってしまえばSteamAPIを使う必要がなくなります。 以下のようなことを行いたいのですが、DXライブラリの全初期化、入力周りの再起動と言ったことは可能でしょうか? 現状だと、@〜Cを実施してもパッドが使えるようにはなりません。 SteamAPIがきちんと終了しているのであれば、DXライブラリを再起動?できれば再度パッド操作ができるようになってもよいと思いました。 @ゲームのステージクリア ASteamAPI初期化(SteamAPI_Init) BSteamにランキングをアップロード CSteamAPIを終了(SteamAPI_Shutdown) DDXライブラリの入力を再起動 Eパッドが使えるようになりゲーム再開
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.8 )
名前:とらふずく 日時:2022/07/26 01:37

追記です。 >以下のようなことを行いたいのですが、DXライブラリの全初期化、入力周りの再起動と言ったことは可能でしょうか? >現状だと、@〜Cを実施してもパッドが使えるようにはなりません。 >SteamAPIがきちんと終了しているのであれば、DXライブラリを再起動?できれば再度パッド操作ができるようになってもよいと思いました。 かなり行儀が悪いプログラムですがDXライブラリをDxLib_End後にDxLib_GlobalStructInitialize、DxLib_Initすれば、パッド入力が可能になりました。 ただし、グラフィックハンドラ等がすべてリリースされているので画面が真っ暗になりました。 パッド入力周りの再起動処理があれば教えて頂けないでしょうか? DxLib_Init(); // ゲームのステージクリア SteamAPI_Init(); // ランキング処理 DxLib_End(); DxLib_GlobalStructInitialize(); DxLib_Init(); // パッドが操作可能
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.9 )
名前:管理人 日時:2022/07/27 00:16

なるほど、一時的に Steam API が使用できれば良いのですね > パッド入力周りの再起動処理があれば教えて頂けないでしょうか? パッド入力周りの再起動処理の関数としてリファレンスには載っていませんが ReSetupJoypad という関数がありますので よろしければお試しください m(_ _)m // ジョイパッドの再セットアップを行う int ReSetupJoypad( void ) ;
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.10 )
名前:とらふずく(解決済み) 日時:2022/07/27 23:40

管理人さんご回答ありがとうございます ReSetupJoypadを試しましたが、残念ながらパッド入力できるようにはなりませんでした。 SteamAPIでDXライブラリのパッドが使用できなくなる件に関しては、DXライブラリとしての解決策は無さそうですので解決済みとさせて頂きます。 いろいろ回答して下さりありがとうございます。
メンテ
Re: SteamAPIの初期化を行うとGetJoypadInputState等の関数が一切動作しなくなる ( No.11 )
名前:管理人(解決済み) 日時:2022/07/29 01:24

うーん駄目でしたか… 私も手元で DxLib_Init(); SteamAPI_Init(); DxLib_End(); DxLib_GlobalStructInitialize(); DxLib_Init(); を実行するテストを行ってみたのですが、とらふずくさんの結果とは異なりDXライブラリで 入力を取得できるようにはなりませんでした 私の方でも今後 Steam Input 無効化に関する情報が得られた際にはこちらに投稿したいと思います m(_ _)m
メンテ

Page: 1 |

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

   クッキー保存