【问题标题】:Process.Start opens too many browsers in XNA gameProcess.Start 在 XNA 游戏中打开太多浏览器
【发布时间】:2011-09-21 15:28:50
【问题描述】:

我正在用 XNA 创建一个在 PC 上运行的游戏。

在初始屏幕上,用户有三个选项。如果他们按“Enter”,游戏将开始,如果他们按“M”,他们将进入帮助菜单,如果他们按“W”,我希望将他们带到我的网站。

我正在使用 Process.Start 将浏览器打开到我的网站。

问题是当我按“W”时,有时它会打开 1 个浏览器和网站。但是,大多数情况下,它会同时打开 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");

           }
        }

谢谢,

迈克

【问题讨论】:

    标签: xna process.start


    【解决方案1】:

    处理此问题的常用方法是始终从前一帧跟踪键盘状态。如果一个键在前一帧没有按下,但在这一帧按下,那么你知道它刚刚被按下。如果键在前一帧被按下,那么您就知道它被按下了。

    // 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);
    }
    

    【讨论】:

    • 我更喜欢这种方式,而不是 OPs “launchFlag” 解决方案,因为这样一来,一旦关闭窗口或一段时间后,您就不必处理任何逻辑来使 launchFlag 再次变为 false时间。
    【解决方案2】:

    您使用的代码每秒运行大约 60 次;您可能只能按下您的键 100 毫秒左右,但在此期间它会检查 W 是否被按下了大约 7 次。因此,它会打开大量浏览器窗口。

    尝试记录您打开浏览器时的时间戳(使用DateTime.Now),然后在允许打开另一个窗口之前检查是否已经过了一定时间(~2 秒?)。或者,通过打开浏览器创建一个设置为 false 的布尔标志,这样浏览器只能打开一次。

    【讨论】:

      【解决方案3】:

      谢谢大家,这就是问题所在。

      Callum Rogers 的解决方案是最简单的:

      我声明了一个布尔值:

         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 个浏览器!

      谢谢,

      迈克

      【讨论】:

      • 如果他们想再次启动浏览器会发生什么?您必须添加代码来处理将launchFlag 再次设置为false。当您开始添加需要检测按键而不是按键按下的其他功能时会发生什么?您必须为每种情况添加 launchFlags,以及重置它们的逻辑。最佳做法是使用之前的键状态方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多