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

您可以创建一个静态变量:SelectedPlayer,然后将第一个玩家分配给它!

然后你可以通过这个类调用第一个玩家,

例如

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

在你的代码循环之后,你可以说:

GameManager.SelectedPlayer = FirstPlayer;

我希望这会有所帮助,如果您的代码更清晰,那将更容易帮助:)

于 2012-05-21T22:24:06.107 回答
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());
        }
    }

注意:这仅适用于一个控制器。要扩展实现,您需要执行以下操作:

    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。

Check out the MSDN Game State Management Sample for a well developed implementation. I can't remember if it supports multiple controllers, but the structure is clear and can easily be adapted if not.

于 2012-05-22T09:56:31.917 回答