問題タブ [xinput]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Xinput を使用して、Xbox コントローラーの両方のサム スティックが値を変更しない
Xinput API を使用していますが、次のコードで問題が発生しています。私の仮定では、R/LX と R/LY の定義は何度も呼び出されると動的に変化するはずですが、サム スティックの位置の値は任意に -13108 に設定されているため、X と Y の正規化された大きさはは -.707 で、正規化された等級は ~.428 です。操縦桿を動かそうとし続けますが、値が変わりません。何か案は?Xinput API を誤解していますか? 構造体コントローラーの状態は意味がありますか? 以下のコードは左スティック用ですが、右スティックも非常に似ています。
hid - HID API 以外の XBox 360 コントローラーの読み取り中にブロックする方法はありますか?
XBox 360 コントローラーをポーリングせずに読み取ろうとしています。(正確には、私は Logitech F310 を実際に使用していますが、私の Windows 10 PC はそれを XBox 360 コントローラーとして認識しています。) オーバーラップ I/O を使用して 2 つのスレッドでブロックする、かなり厄介な HID コードをいくつか作成しました。 1 つは HID デバイスから読み取る準備ができているレポートがあることを示し、もう 1 つは UI スレッドが HID スレッドの終了を要求したことを示します。これで問題なく動作しますが、HID ドライバーの動作は XInput とは多少異なります。特に、2 つのトリガーを 1 つの値に統合し、それらの差のみを渡します (プレイヤーの指がコントロールから離れている場合、ゲームは HID 値が 0x80 であることを期待しているという奇妙な主張について)。XInput はこれらを 2 つの異なる値として扱います。これは大きな改善です。また、XInput はハット スイッチを 4 ビットとして報告します。
私にとっての XInput の欠点は、コントローラーが値またはボタンのいずれかを変更するまで、読み取り要求をブロックする方法がないように見えることです。HID デバイスとして、ReadFile 呼び出しはブロックされます (正確には、データが利用可能になるまで WaitForMultipleEvents がブロックされます)。XInput はポーリングを想定しているようです。ゲームの状態を更新するたびにコントローラーをポーリングするように自然に記述されるゲームの場合 (たとえば、新しいビデオ フレームが表示されるたびに 1 回)、これは理にかなっています。しかし、別の目的でコントローラーを使用したい場合 (私は演劇用のアプリケーションに取り組んでいます)、HID API が提供するような純粋な非同期システムが必要になる場合があります。ただし、HID API は 2 つの値トリガーを結合します。
ここで、XInput を使用してデバイスを読み取ると、すべてのコントロールの状態を取得するだけでなく、パケット番号も取得します。MSDN によると、パケット番号は、コントロールの状態が変化した場合にのみ変化します。そうすれば、連続するパケット番号が同じである場合、最初のパケット以降の処理に煩わされる必要はありません。コントローラーの状態が変化していないことがわかっているからです。しかし、あなたはまだポーリングを行っていますが、これは私にはやや下品です。
しかし、興味深いのは、ポーリングの間に大きな遅延 (100 ミリ秒) を入れると、値コントロール (トリガーまたはスティック) が移動しているときにパケット数が 1 よりも多く増加することがわかります。これは、デバイスがポーリングを待たずにパケットを送信していること、およびポーリングするたびに最新のパケットしか取得していないことを示唆していると思います。その場合、まったくポーリングする必要はなく、パケットが送信されるまでブロックし、送信されたときにのみ反応できるようにする必要があるようです。しかし、これがオプションであるという兆候は見つかりません。HID APIでブロックできるので、やってみずに諦めたくない(ここでアドバイスを求めることも含めて)。
コントローラー用の独自のドライバーを作成する以外に (独自のドキュメントがなければオプションであるかどうかもわかりません)、重複する I/O (またはその他のブロッキング方法) を使用して XBox 360 コントローラーを読み取る方法を知っている人はいますか?トリガーを個別の値として、ハットを 4 つのボタンとして XInput が行う方法は?
以下は、コントローラーを読み取り、読み取り間でパケット番号が複数回ジャンプできることを示す、私が書いたコードです。
DirectInput はトリガーを 1 つの値に結合するため、あまり役に立たないことに注意してください。
ありがとう!
c++ - マウスの移動とキーが押されたときのwinapi入力遅延読み取りイベント
fpsベースのゲームを作っています。現在、入力用のすべてのイベントをキャプチャする wnd_proc 関数があります (WM_MOUSEMOVE、WM_KEYUP、WM_KEYDOWN、...)。私のマウスは、fpsのようにカメラを動かすために使用されます。マウスだけを動かしているときはうまくいきます。しかし、キーを押してキャラクターを動かしながら同時にマウスを動かすと、ゲーム内でマウスの動きを検出するのに遅延が生じます。複数のキーを押したときにも遅延に気付きます。
キーボード イベントについては、独自の入力クラスを使用してキーが押されているかどうかを確認する代わりに、GetAsyncKeyState() を使用してキーボードの内容を読み取り、これにより複数のキーの遅延が修正されます。しかし、私のマウスはまだ問題です。マウスの動きに非同期機能はありますか?
- 編集 -
これは、wndproc 関数で呼び出される入力システム クラスです。
以下は私の入力クラスですが
visual-studio-2015 - Visual Studio 2015 + XInput + XP ツールセット
入力を使用する Visual Studio 2015 ソリューションがあります: XInput9_1_0.lib がリンカーの依存関係に追加され、既定のツールセット (v140) を使用するとすべて正常に動作します。
私のコードを XP で実行できるようにするために、ツールセットを v140_xp に変更しました。これですべて正常にコンパイルされますが、リンカ エラー (「入力ファイル 'XInput9_1_0.lib' を開けません」) が発生します。
C ドライブで XInput9_1_0.lib を検索しましたが、フォルダー内でしか見つかりません。
C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x64 C:\Program Files (x86)\Windows Kits\8.1\Lib\winv6.3\um\x86 C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x64 C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x86
ツールセット v140 で使用されていたものは、ツールセット v140_xp では検索されなくなったと思います。
私の問題を解決する適切な方法は何ですか?
c++ - C++ XInput と XBOX 360 コントローラーが接続しない
XBOX 360 コントローラーを接続してプログラムの入力を取得しようとしていますが、私のプログラムは接続されたコントローラーを登録しません。コントローラーが接続されていることを確認しました。
Windowsを実行し、 C++でプログラミングし、IDE にQTを使用しています。私のコードは次のとおりです: https://www.codeproject.com/articles/26949/xbox-controller-input-in-c-with-xinput
私がそのサイトから使用しなかった唯一のコードはインクルードです。私のインクルードは次のとおりです。
私のXinputライブラリは私の.proに次のように含まれています:
win32: ライブラリ += -lXinput9_1_0
コードを実行すると、プログラムがコントローラーに接続されません。
欠けているもの、または台無しにしたものはありますか?
c++11 - XINPUT_GAMEPAD_A は、プログラムの起動時にボタンを押し続けないと機能しません
だから私は自分のプログラムで xinput を使用しています。すべてセットアップされて動作しているので、xbox one コントローラーを検出できます。コントローラーのボタンが押されたことを検出できるようにしたい。プログラムの起動時にボタンを押したままにすると、私が使用する手順が機能します。しばらくの間 if コマンドをセットアップしているので、コントローラーで A を押しても何らかの理由で値が変化しませんが、常に実行されます。
したがって、基本的に、プログラムが開いているときに A を押したままにすると、機能して画面に cout が返されます。プログラムの開始後に少し押したい場合(これが私がやりたいことです)、それを検出しません。
これが私のコードです:
私の知る限り、正しいライブラリをすべて正しい順序で含めています。