0

タイトル画面に、A を使用する最初のコントローラーが PlayerIndex.one であることを示すコードがあります。コードは次のとおりです。

    public override void HandleInput(InputState input)
    {
        for (int anyPlayer = 0; anyPlayer <4; anyPlayer++)
        {
            if (GamePad.GetState((PlayerIndex)anyPlayer).Buttons.A == ButtonState.Pressed)
            {
                FirstPlayer = (PlayerIndex)anyPlayer;

                this.ExitScreen();
                AddScreen(new Background());
            }
        }
    }

私の質問は次のとおりです。「FirstPlayer」を他のクラスで使用するにはどうすればよいですか? (これがなければ、このコードには興味がありません) Get Set を試しましたが、うまくいきません。コードを別のクラスに配置する必要がありますか? これを行うために他のコードを使用しますか?

ありがとう。

4

2 に答える 2

1

わかりました。これを適切に行うには、少し再設計する必要があります。

最初に、新しいゲームパッド入力をチェックする必要があります (つまり、'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 ゲーム ステート管理のサンプルを確認してください。複数のコントローラーをサポートしているかどうかは覚えていませんが、構造は明確で、そうでない場合でも簡単に適応できます。

于 2012-05-22T09:56:31.917 に答える
1

SelectedPlayer という静的変数を作成し、それに最初のプレーヤーを割り当てることができます。

次に、このクラスを介して最初のプレーヤーを呼び出すことができます。

例えば

class GameManager
{
   public static PlayerIndex SelectedPlayer{get;set;}
      ..
      ..
       ..
}

コード内のループの直後に、次のように言うことができます。

GameManager.SelectedPlayer = FirstPlayer;

あなたのコードがより明確になり、助けやすくなれば、これが役立つことを願っています:)

于 2012-05-21T22:24:06.107 に答える