0

デフォルトの XNA 入力は、フレーム処理中 (更新呼び出しの間、キーが押された直後) に何らかのメソッドを呼び出す可能性があるイベント ハンドラーを提供しません。

Nuclex.Input を使用してみましたが、いくつかの欠陥があります — F10、Alt、Pause などのキーは、割り当てられたイベントを起動しません。これらのキーの一部はGetKeyboard().GetState().GetPressedKeys()リストに表示されますが、リストに表示されないものもあります。これは、ショートカットの作成には受け入れられません。

XNA のデフォルトの入力マネージャーをイベントで動作させる方法があれば嬉しいのですが、それが可能だと言う人を見たことがありません。だから私はおそらく、プレス/リリースイベントハンドラーで可能なキープレスを私に与えることができる他の入力マネージャーを探しています。

または、キーのプレス/リリースに対してハンドラーイベントを起動するなど、Windowsフックを使用してサードパーティライブラリの使用を回避する方法があるでしょうか?

それとも、この XNA の入力方法全体が台無しになり、上位クラスのゲーム エンジンがまったく異なるアプローチを使用するのでしょうか?


ここ数年、誰もが XInput を使用しています。

4

2 に答える 2

0

これは私の古いプロジェクトのコードです。KeyboardState2 つのオブジェクトの違いを見つけます。KeyboardState具体的には、最初のキーではなく 2 番目のキーでダウンしているキーを含む を返します。

KeyboardState GetKeysPressedBetween(KeyboardState first, KeyboardState second)
{
    KeyboardState pressed = new KeyboardState();
    for (int i = 0; i < 8; i++)
    {
        FieldInfo currentStateI = typeof(KeyboardState).GetField("currentState" + i, BindingFlags.NonPublic | BindingFlags.Instance);
        uint firstCurrentStateI = (uint)currentStateI.GetValue(first);
        uint secondCurrentStateI = (uint)currentStateI.GetValue(second);
        currentStateI.SetValueDirect(__makeref(pressed), ~firstCurrentStateI & secondCurrentStateI);
    }
    return pressed;
}

これは通常、現在の状態を前の状態と比較して、フレームごとに 1 回呼び出されます。

コードを変更して、解放されたキーを取得することができます。

~firstCurrentStateI & secondCurrentStateI

firstCurrentStateI & ~secondCurrentStateI
于 2013-02-23T21:06:02.773 に答える
0

今のところ、XNA ゲームに Nuclex.Input を使用することに頼っていますが、まだより良い代替手段を探しています。

Nuclex.Input のいくつかの問題は、左と右の Shift または Ctrl ボタンを区別せず、一部のキー (F10、左 Alt、PrintScreen、Pause など) を検出しないことです。

于 2013-08-13T07:30:34.200 に答える