2012-05-21 124 views
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的東西,但我不能讓它工作。我需要將我的代碼放在另一個類中嗎?你使用其他代碼來做到這一點?

謝謝。

回答

1

你可以使一個靜態變量說:SelectedPlayer, 並分配第一個玩家!

,那麼你可以通過這個類調用的第一個球員,

例如

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

,並在代碼中循環之後,你可以說:

GameManager.SelectedPlayer = FirstPlayer; 

希望這有助於,如果你的代碼冷卻更清晰,會更容易幫助:)

+0

我會盡力:)。謝謝 – Pilispring

+0

很高興幫助:) 歡迎您 – Zero

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是否按下按鈕。

檢查MSDN Game State Management Sample爲一個發達的實施。我不記得它是否支持多個控制器,但是結構很清晰,如果不是,可以很容易地進行調整。

+0

幹得好,但以前的答案完美無缺 – Pilispring