2011-09-21 38 views
2

我在XNA上創建了一款在PC上運行的遊戲。Process.Start在XNA遊戲中打開太多瀏覽器

在啓動畫面上,用戶有三個選項。如果他們按下「Enter」,遊戲將開始,如果他們按下「M」,他們將進入幫助菜單,如果他們按下「W」,我希望將他們帶到我的網站。

我使用Process.Start打開瀏覽器到我的網站。

問題是,當我按「W」時,有時它會打開一個瀏覽器與網站。但是,大多數情況下,它會同時打開3-7個瀏覽器。

爲什麼它同時打開多個瀏覽器?

當按下「W」鍵時,如何才能打開1個瀏覽器?

這是我的代碼。我還沒有建立自己的網站呢,所以我使用yahoo.com作爲目標:

private void UpdateSplashScreen() 
    { 
     KeyboardState keyState = Keyboard.GetState(); 

     if (gameState == GameState.StartScreen)    
     { 
      if (keyState.IsKeyDown(Keys.Enter)) 
      { 
       gameState = GameState.Level1; 
       explosionTime = 0.0f; 
      } 

      if (keyState.IsKeyDown(Keys.M)) 
      { 
       gameState = GameState.HelpScreen; 
      } 

      if (keyState.IsKeyDown(Keys.W)) 
      { 

      Process.Start("IExplore.exe", "www.yahoo.com"); 

      } 
     } 

感謝,

邁克

回答

1

您正在使用的代碼運行第二個約60倍;你只能按下你的鍵大約100毫秒左右,但在這段時間它會檢查W是否被按下了大約7次。因此,它會打開大量的瀏覽器窗口。

嘗試記錄打開瀏覽器時的時間戳(使用DateTime.Now),然後檢查是否已經過了一段時間(約2秒?),然後再打開另一個窗口。或者,通過打開瀏覽器創建一個設置爲false的布爾標誌,以便瀏覽器只能打開一次。

3

處理此問題的常用方法是始終跟蹤前一幀的鍵盤狀態。如果一個鍵沒有停留在前一幀,但是按下了這個框,那麼你知道它剛剛被按下。如果鑰匙在前一幀停機,那麼你知道它被按下了。

// somewhere in your initialization code 
KeyboardState keyState = Keyboard.GetState(); 
KeyboardState previousKeyState = keyState; 
... 

private void UpdateSplashScreen() 
{ 
    previousKeyState = keyState;  // remember the state from the previous frame 
    keyState = Keyboard.GetState(); // get the current state 

    if (gameState == GameState.StartScreen)    
    { 
     if (keyState.IsKeyDown(Keys.Enter) && !previousKeyState.IsKeyDown(Keys.Enter)) 
     { 
      gameState = GameState.Level1; 
      explosionTime = 0.0f; 
     } 

     if (keyState.IsKeyDown(Keys.M) && !previousKeyState.IsKeyDown(Keys.M)) 
     { 
      gameState = GameState.HelpScreen; 
     } 

     if (keyState.IsKeyDown(Keys.W) && !previousKeyState.IsKeyDown(Keys.W)) 
     { 

     Process.Start("IExplore.exe", "www.yahoo.com"); 

     } 
    } 

我通常會創建一個則KeyPressed功能,清除了一點東西。

bool KeyPressed(Keys key) 
{ 
    return keyState.IsKeyDown(key) && !previousKeyState.IsKeyDown(key); 
} 
+0

一旦你關閉我喜歡這種方式比行動「launchFlag」更好的解決方案,因爲這樣一來你沒有處理任何邏輯,使launchFlag虛假再次窗口或一段時間後。 – Benjamin

0

謝謝你們,那就是問題所在。

卡勒姆·羅傑斯的解決方案是最簡單的:

我宣佈一個布爾值:

bool launchFlag = false; 

然後選中它並推出了網站後,設置爲true。

private void UpdateSplashScreen() 
{ 
    KeyboardState keyState = Keyboard.GetState(); 

    if (gameState == GameState.StartScreen)    
    { 
     if (keyState.IsKeyDown(Keys.Enter)) 
     { 
      gameState = GameState.Level1; 
      explosionTime = 0.0f; 
     } 

     if (keyState.IsKeyDown(Keys.M)) 
     { 
      gameState = GameState.HelpScreen; 
     } 

     if (keyState.IsKeyDown(Keys.W)) 
     { 

     if (launchFlag == false) 
       { 
        Process.Start("IExplore.exe", "www.yahoo.com"); 
        launchFlag = true; 
       } 
     } 
    } 

我按住了W鍵30秒,它只啓動了1個瀏覽器!

感謝,

邁克

+0

如果他們想要再次啓動瀏覽器會發生什麼?您必須添加代碼才能將launchFlag設置爲false。當你開始添加需要檢測按鍵而不是按鍵的其他功能時會發生什麼?您必須爲每種情況添加launchFlags,以及重置它們的邏輯。最佳做法是使用以前的鍵狀態方法。 –