Xbox Controller Inputでこのジレンマに実際に遭遇しました。まったく同じではありませんが、かなり似ています。この例のコードは、ニーズに合わせて変更できます。
編集:あなたの状況はこれを使用します->
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/ns-winuser-tagrawmouse
そして、あなたは生の入力クラスを作成する方法を学ぶことができます->
https://docs.microsoft.com/en-us/windows/desktop/inputdev/raw-input
しかし..今、非常に素晴らしいアルゴリズムに...本当にそうではありませんが、ちょっと..それはかなりクールです:)
*したがって...すべてのボタンの状態を保存できます。これらのボタンは、押された状態、リリースされた状態、押し下げられた状態です!!! 保留時間も確認できますが、これには単一のifステートメントが必要であり、任意の数のボタンを確認できますが、この情報についてはいくつかのルールがあります。
明らかに、何かが押されたり、離されたりしたかどうかを確認したい場合は、「If(This){}」を実行しますが、これは、プレス状態を取得して次のフレームをオフにする方法を示しています。 ismousepressed」は、次にチェックするときに実際にfalseになります。
完全なコードはこちら:https :
//github.com/JeremyDX/DX_B/blob/master/DX_B/XGameInput.cpp
使い方..
したがって、ボタンが押されているかどうかを表すときに受け取る値はわかりませんが、基本的にXInputを読み込むと0から65535の16ビット値が得られ、これには「Pressed」の15ビットの状態があります。
問題は、これをチェックするたびでした。情報の現在の状態を単純に教えてくれます。現在の状態を、Pressed、Release、およびHold Valueに変換する方法が必要でした。
だから私がやったことは次のとおりです。
まず、「CURRENT」変数を作成します。このデータを確認するたびに、「CURRENT」を「PREVIOUS」変数に設定し、次に示すように「Current」に新しいデータを保存します->
uint64_t LAST = CURRENT;
CURRENT = gamepad.wButtons;
この情報があれば、ここがわくわくするところです!!
これで、ボタンが押し下げられているかどうかがわかります!
BUTTONS_HOLD = LAST & CURRENT;
これは基本的に、2つの値を比較し、両方に表示されるボタンの押下は1のままで、その他はすべて0に設定されます。
すなわち(1 | 2 | 4)&(2 | 4 | 8)は(2 | 4)を生成します。
これで、どのボタンが "HELD"ダウンされたかがわかりました。残りを取得できます。
押されるのは簡単です。「現在」の状態を保持し、押されたボタンを削除します。
BUTTONS_PRESSED = CURRENT ^ BUTTONS_HOLD;
リリースは同じですが、代わりに最後の状態と比較します。
BUTTONS_RELEASED = LAST ^ BUTTONS_HOLD;
押された状況を見てください。たとえば、現在2つありました| 4 | 8を押した。2 | 開催場所4。保留ビットを削除すると、8だけが残ります。これは、このサイクルで新しく押されたビットです。
同じことがリリース済みにも適用できます。このシナリオでは、「LAST」は1に設定されました。2 | 4.したがって、2を削除すると| 4ビット。最後のフレーム以降、ボタン1がリリースされました。
上記のシナリオは、おそらくビット比較のために提供できる最も理想的な状況であり、ifステートメントやforループを使用せずに3レベルのデータを提供します。
保持データを文書化することもしたかったので、私の状況は完全ではありませんが...基本的に、確認したい保持ビットを設定します。
したがって、Press / Release / Holdデータを設定するたびに、ホールドデータが現在のホールドビットチェックに等しいかどうかをチェックします。リセットされない場合は、現在の時刻にリセットされます。私の場合、フレームインデックスに設定しているので、フレームがいくつ押されているかがわかります。
このアプローチの欠点は、個別のホールドタイムを取得できないことですが、一度に複数のビットをチェックできます。つまり、ホールドビットを1に設定すると| 16は、1または16のいずれかが保持されていない場合、失敗します。そのため、カチカチ音をたて続けるには、これらすべてのボタンを押し続ける必要があります。
次に、コードを見ると、すてきな関数呼び出しがすべて表示されます。
したがって、この例では、ボタンの押下が発生したかどうかをチェックするだけで、ボタンの押下はこのアルゴリズムで1回しか実行できません。押すための次のチェックでは、もう一度押す前にリリースする必要があると、それ以上押すことができないため、存在しません。