C#アプリケーションのマウス、キーボード、ゲームパッドの状態の変化にすぐに対応する方法はありますか?
XNAは他のC#アプリとまったく同じであるため、違いはないかもしれませんが、念のため、対応するイベントをすぐに起動して、XNAゲームの入力を改善したいと思います。
デフォルトのXNAにはイベントハンドラーがありません(少なくとも、言及されているのを見たことがありません)。Nuclex.Inputは、一部のキー(Alt、F10、または一時停止など、受け入れられない)を検出しません。
通常、前のフレームの入力の状態を保存してから、フレーム間で入力が変化したかどうかをテストします。たとえば、Update
メソッドは次のようになります。
KeyboardState ks = Keyboard.GetState();
if(ks.IsKeyDown(Keys.Space) && lastKeyboardState.IsKeyUp(Keys.Space))
{
DoAThing();
}
lastKeyboardState = ks;
(そのコードは完全に記憶から書いたので、完全に正しくないかもしれません。しかし、概念を説明する必要があります。)
これにより、重要なイベントが遅れることなく提供されます1 / yourFPS
。60FPS では約 16ms です。これは通常、ゲームプレイの目的では許容されます。特に - が必要な場合は、上記の ,event
を配置した場所で簡単に起動できます。DoAThing
テキストを入力するには、通常、Windows からの文字イベントが必要です (ライブラリのようなものNuclex.Input
が提供されます)。これはレイテンシーを改善するためではありませんが、順序付けられた信頼性の高い方法でキーボード イベントを取得できます (たとえば、この方法では、1 つのフレームで 2 つのキーがダウンしてあいまいな順序になることはありません)。
さらに重要なことは、Windows が入力処理を適用する機会を得た後にイベントを取得できるようにすることです。たとえば、これにより、入力する ana
と anの違いがわかりますA
。または、誰かが alt+テンキーで文字を入力したり、分音記号を適用したりします。欠点は、あなたが言及したように、、、、などのさまざまな非テキストキーを見逃すAlt
ことF10
ですPause
。
最後に、ざっと読んでみるNuclex.Input
と、少なくとも必要なキー、具体的にはIKeyboard.KeyPress
とを提供する必要があることがわかります.KeyRelease
。動作しない場合は、 のバグである可能性がありますNuclex
。または、システム上の何かがウィンドウ メッセージに干渉しています。
考えられる回避策の 1 つは、不足しているキーもポーリングすることで、これらの不足しているキーのレイテンシを受け入れることです。ポーリングをシームレスなフォールバックとして使用するコードは、おそらくかなり単純です。