2011-09-21 5 views
2

PC에서 실행되는 XNA에서 게임을 만들고 있습니다.Process.Start가 XNA 게임에서 너무 많은 브라우저를 엽니 다.

스플래시 화면에는 세 가지 옵션이 있습니다. 그들이 "Enter"를 누르면 게임이 시작되고, "M"을 누르면 도움말 메뉴로 이동하고 "W"를 누르면 내 웹 사이트로 이동하게됩니다.

나는 Process.Start를 사용하여 브라우저를 내 웹 사이트에 엽니 다.

"W"를 누르면 웹 사이트와 함께 1 개의 브라우저가 열리는 것이 문제입니다. 그러나 대부분의 경우 3 ~ 7 개 브라우저를 동시에 열 수 있습니다.

동시에 여러 브라우저를 여는 이유는 무엇입니까?

"W"를 눌렀을 때 어떻게 하나의 브라우저 만 열리도록합니까?

여기 내 코드입니다.

마이크

답변

1

당신이 실행을 사용하는 코드를 약 1 초에 60 번

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"); 

      } 
     } 

감사합니다 : 난 아직 내 웹 사이트를 구축하지 않은, 그래서 대상으로 yahoo.com을 사용하고 있습니다 ; 100ms 정도 키를 누를 수 있지만 그 시간에 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

나는 다시, OPS "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 개만 시작했습니다.이 방법을 사용하면 launchFlag 거짓을 만들기 위해 어떤 논리를 처리 할 필요가 없기 때문에 당신이를 닫으면

감사합니다,

마이크

+0

브라우저를 다시 시작하려면 어떻게해야합니까? launchFlag를 false로 다시 설정하는 코드를 추가해야합니다. keydown 대신 keypress를 감지해야하는 다른 기능을 추가하기 시작하면 어떻게됩니까? 각 상황에 대해 launchFlags를 추가하고 다시 설정하는 로직을 추가해야합니다. 가장 좋은 방법은 이전 키 상태 방법을 사용하는 것입니다. –

관련 문제