首页 文章

Process.Start在XNA游戏中打开太多浏览器

提问于
浏览
2

我在XNA上创建一个在PC上运行的游戏 .

在启动屏幕上,用户有三个选项 . 如果他们按“Enter”,游戏将开始,如果他们按“M”,他们将进入帮助菜单,如果他们按“W”我想要将它们带到我的网站 .

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

问题是,当我按“W”时,有时会打开1个浏览器与网站 . 但是,大多数情况下它会同时打开3到7个浏览器 .

为什么同时打开多个浏览器?

当按下“W”时,如何只打开1个浏览器?

这是我的代码 . 我还没有 Build 我的网站,所以我使用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");

           }
        }

谢谢,

麦克风

3 回答

  • 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);
    }
    
  • 3

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

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

  • 0

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

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

    谢谢,

    麦克风

相关问题