はい、それは完全に合理的です、そして私はそれでそれを残すことができました!
...でも個人的にはもう少しカプセル化する方が好きです。したがって、内部の状態を管理する代わりにGame
クラスそれにグローバルアクセスを提供する代わりに、それを独自のクラスにラップすることを好みます。
メモリからの例です。詳細を逃したかどうかはわかりませんが、重要なのは一般的な考え方です。
public static class InputManager
{
public static void Update()
{
_previousKeyboardState = _currentKeyboardState;
_currentKeyboardState = Keyboard.GetState();
}
public static bool IsKeyDown(Keys key)
{
return _currentKeyboardState.IsKeyDown(key);
}
public static bool IsKeyUp(Keys key)
{
return _currentKeyboardState.IsKeyUp(key);
}
public static bool OnKeyDown(Keys key)
{
return _currentKeyboardState.IsKeyDown(key) && _previousKeyboardState.IsKeyUp(key);
}
public static bool OnKeyUp(Keys key)
{
return _currentKeyboardState.IsKeyUp(key) && _previousKeyboardState.IsKeyDown(key);
}
private static KeyboardState _currentKeyboardState;
private static KeyboardState _previousKeyboardState;
}
次にGame.Update
、マネージャーのUpdateを呼び出すだけです。
InputManager.Update();
そして最後に、ゲームの他のすべての場所でラッパーを直接使用できます。
if(InputManager.OnKeyDown(Keys.Space))
{
// Shoot once
}
いくつかの利点:
- ソリューションと同様に、現在と以前のキーボードの状態を管理する必要があるのは、アプリケーション内の1箇所だけです。
- ただし、キーボード処理でゲームクラスを汚染するのではなく、そのために独自のクラスにカプセル化されます。
- クラスは静的であるため、グローバルにアクセスできます。したがって、必要ない場合は、ゲームクラスへのグローバルアクセスを提供する必要はありません。
- また、再利用も簡単です。新しいプロジェクトを開始する場合は、そのクラスをドロップするだけで十分です。