2011-09-21 40 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,以及重置它们的逻辑。最佳做法是使用以前的键状态方法。 –