わかりました。これを適切に行うには、少し再設計する必要があります。
最初に、新しいゲームパッド入力をチェックする必要があります (つまり、'A' が新たに押された場合にのみ画面を終了する必要があります)。これを行うには、以前と現在のゲームパッドの状態を保存する必要があります。
private GamePadState currentGamePadState;
private GamePadState lastGamePadState;
// in your constructor
currentGamePadState = new GamePadState();
lastGamePadState = new GamePadState();
// in your update
lastGamePadState = currentGamePadState;
currentGamePadState = GamePad.GetState(PlayerIndex.One);
本当に必要なのは、入力を処理するクラスを変更することです。HandleInput 関数の基本機能は、入力クラスに移動する必要があります。入力には、新しい/現在の入力をテストする関数のコレクションが必要です。たとえば、投稿したケースの場合:
public Bool IsNewButtonPress(Buttons buton)
{
return (currentGamePadState.IsButtonDown(button) && lastGamePadState.IsButtonUp(button));
}
次に、次のように記述できます。
public override void HandleInput(InputState input)
{
if (input.IsNewButtonPress(Buttons.A)
{
this.ExitScreen();
AddScreen(new Background());
}
}
注: これは 1 つのコントローラーでのみ機能します。実装を拡張するには、次のようにする必要があります。
private GamePadState[] currentGamePadStates;
private GamePadState[] lastGamePadStates;
// in your constructor
currentGamePadStates = new GamePadState[4];
currentGamePadStates[0] = new GamePadState(PlayerIndex.One);
currentGamePadStates[1] = new GamePadController(PlayerIndex.Two);
// etc.
lastGamePadStates[0] = new GamePadState(PlayerIndex.One);
// etc.
// in your update
foreach (GamePadState s in currentGamePadStates)
{
// update all of this as before...
}
// etc.
ここで、すべてのコントローラーの入力をテストする必要があるため、配列内の各 GamePadState でボタンの押下を確認した後に Bool を返す関数を記述して一般化する必要があります。
十分に開発された実装については、 MSDN ゲーム ステート管理のサンプルを確認してください。複数のコントローラーをサポートしているかどうかは覚えていませんが、構造は明確で、そうでない場合でも簡単に適応できます。