Process.Start открывает слишком много браузеров в игре XNA - PullRequest
2 голосов
/ 21 сентября 2011

Я создаю игру в XNA, которая работает на ПК.

На заставке у пользователя есть три варианта. Если они нажмут «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");

           }
        }

Спасибо

Mike

Ответы [ 3 ]

3 голосов
/ 21 сентября 2011

Обычный способ справиться с этим - всегда отслеживать состояние клавиатуры из предыдущего кадра. Если клавиша не была нажата в предыдущем кадре, но была нажата в этом кадре, то вы знаете, что она была просто нажата. Если клавиша была нажата в предыдущем кадре, то вы знаете, что она удерживается нажатой.

// 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);
}
1 голос
/ 21 сентября 2011

Код, который вы используете, выполняется около 60 раз в секунду; Вы можете нажимать клавишу только на 100 мс или около того, но в это время она проверяет, нажата ли W примерно 7 раз. Таким образом, он открывает большое количество окон браузера.

Попробуйте записать метку времени (используя DateTime.Now), когда вы открываете браузер, а затем убедитесь, что прошло определенное время (~ 2 секунды?), Прежде чем разрешить открытие другого окна. Или создайте логический флаг, для которого установлено значение false, открыв браузер, чтобы браузер можно было открыть только один раз.

0 голосов
/ 22 сентября 2011

Спасибо, ребята, вот в чем проблема.

Решение 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 браузер!

Спасибо

Mike

...