ステートマシンに入力を渡す(c#)
-
04-07-2019 - |
質問
できる限り最善の方法でシナリオを説明します。
各アプリケーションで tick キーボードとマウスの現在の状態をクエリし、それらを個々のクラスとデータ構造にラップします。キーボードの場合は Keys 列挙型の配列(現在押されているキーごとに1つのアイテム)、マウスの場合は押された各ボタンの座標デルタとブール値を含むクラスです。
また、スタックを維持し、状態をマーシャリングする状態マネージャークラスを介して管理される初歩的な状態マシンもあります。
知りたいのは、入力(スナップショット)を、アプリがいつでも入ることができる個々の状態にどのように渡すのが最善かということだけです
個々の状態から可能な限り多くの入力を処理して、状態内で繰り返されるロジックを減らしたいと思います。
または、入力スナップショットを可能な限り純粋に保ち、状態に渡して、入力固有のロジックを非表示に保つことができますか?
注
この構造は、ゲームがどのように機能するかを想像するのと似ています。このアプリケーションはゲームではありませんが、できるだけ早く処理する必要があります。
解決
キーボードとマウスの状態を各ティックでクエリするのはなぜですか?はるかに優れた従来のソリューションは、キーボードとマウスから発生したイベントをキャプチャすることです。そうすれば、状態を更新する必要があります。
他のヒント
キーボードとマウスを単にティックごとに照会すると、問題が発生することを保証できます。すべてのティックをクエリすると、(単一のティックの時間領域内で)すばやく発生する入力を見逃すことがわかります。ユーザーが2つのティックの間でキー/ボタンを押して離す状況を想像してください(思った以上に起こります)。入力を完全に見逃してしまいます。
特にこのような入力イベント向けの完全なC#では、イベントを使用する必要があります。
XNAでは、キーボードクラスを静的にすることでこれを行います。
KeyboardState state = Keyboard.GetState();
その後、上記のコード行で現在のキー状態にアクセスできます。
イベントを発生させ、引数をキャプチャする必要があります。これは、これを処理する最も簡単で効率的な方法です。
class YourClass
{
//data members ...
public void OnKeyboardPress(object sender, EventArgs args)
{
//handle your logic capturing the state here
}
}
//elsewhere
someControl.KeyPress += new KeyPressDelegate(yourClassInstance.OnKeyboardPress);