2

我正在 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");

           }
        }

谢谢,

麦克风

4

3 回答 3

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);
}
于 2011-09-21T16:39:05.543 回答
1

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

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

于 2011-09-21T15:34:42.970 回答
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 个浏览器!

谢谢,

麦克风

于 2011-09-22T00:44:54.213 回答