2013-05-24 4 views
2

내 게임에 문제가 있습니다. 두 상태로 나뉩니다 : GameState.MainMenuGameState.Playing. 나는 놀 때 타이머를 화면에 그려 넣고 싶다. 나는 gameTime.TotalGameTime.MinutesgameTime.TotalGameTime.Seconds 변수를 사용합니다. 하지만 Play Now 버튼을 클릭했을 때, 게임이 GameState.MainMenu에서 GameState.Playing으로 바뀌 었습니다. 타이머의 시작 시간은 0부터 시작됩니다. MainMenu에서 소비 한 시간으로 시작합니다. 나는 MainMenu에서 보낸 시간을 계산하기 위해 다음 변수를 만들려고 시도하고 첫 번째 변수에서 빼기를 시도하지만 표시 시간이 적절하지 않습니다.XNA 프레임 워크의 타이머

내 substracting 시간 :

minutesPlaying = gameTime.TotalGameTime.Minutes; ; 
secondsPlaying = gameTime.TotalGameTime.Seconds; 

switch (currentGameState) 
{ 
    case GameState.MainMenu: 

     minutesMenu = gameTime.TotalGameTime.Minutes; 
     secondsMenu = gameTime.TotalGameTime.Seconds; 



     if (btnPlay.isTapped == true) 
     { 
      currentGameState = GameState.Playing; 
      soundEffectInstance.Stop(); 
     } 
     btnPlay.Update(collection); 
     break; 

    case GameState.Playing: 

     minutesTotal = minutesPlaying - minutesMenu; 
     secondsTotal = secondsPlaying - secondsMenu; 

     break; 
} 

호출 내 방법 :

timer.Update(minutesTotal, secondsTotal); 

업데이트 방법 : 답변

public void Update(int min, int sec) 
{ 
    string seconds, minutes; 
    seconds = sec.ToString(); 
    minutes = min.ToString(); 

    if (sec <= 9) seconds = "0" + seconds; 
    if (min <= 9) minutes = "0" + minutes; 

    nowString = minutes + ":" + seconds; 
} 

감사합니다 :)

답변

0

내가 사용하는 것 ' StopWatch '를'시작 '으로, 연주 상태에서 보낸 시간의 추적을 '일시 중지'합니다. 재생 상태가 시작되면 'StopWatch'를 시작한 다음 그 상태를 벗어날 때 일시 정지합니다.

0

당신은 올바른 길을 가고 있습니다.하지만 원래의 gameTime에서이 값을 빼는 대신 변수를 전달해야한다고 생각합니다. 이렇게하면 메뉴로 돌아 가면 다시 게임으로 돌아갈 수 있습니다. 부서지기 쉽다. 기본적으로 0에서 TimeSpan이 걸리고 시간이 지남에 따라 gameTime이 추가되어 레벨에서 소비 한 시간이 표시됩니다.

우선은 case GameState.Playing: 안에 당신의 Update() 방법 지금

public TimeSpan TimePassed;

새로운 TimeSpan

를 추가하면 타이머를 incriment해야합니다.

TimePassed -= gameTime.ElapsedGameTime;

새로운 수준을해야하는 경우도 제로에 타이머를 재설정 할 수 있습니다 : 이제

시간을 렌더링하는 (즉이 적용되면 예는 수준을 재생하는 타이머 재설정이 필요합니다) 귀하의 Draw() 방법입니다.

string timeString = TimePassed.Minutes.ToString("00") + ":" + TimePassed.Seconds.ToString("00"); 
spriteBatch.DrawString(FONT,timeString,POSITION,Color.White); 

그리고 거기에 가세요!

0

재생 상태에서만 시간을 수정해야합니다. 너무 많은 변경 사항이 있어도 코드를 수정했습니다 ... PlayTime은 재생 상태에서 경과 한 총 시간을 유지합니다.게임은 당신이 시간을 추적 할 필요가 없습니다 시작하기 전에

:

timer.Update(Elapsed); 

업데이트 방법 :

TimeSpan PlayTime = TimeSpan.Zero; 
public void Update(TimeSpan Elapsed) 
{ 
    PlayTime.Add(Elapsed); 

    string seconds, minutes; 
    seconds = PlayTime.Seconds.ToString(); 
    minutes = PlayTime.Minutes.ToString(); 

    if (sec <= 9) seconds = "0" + seconds; 
    if (min <= 9) minutes = "0" + minutes; 

    nowString = minutes + ":" + seconds; 
} 
+0

감사합니다. Blau,하지만 작동하지 않습니다. 코드를 바꾸고 게임을 실행하면 타이머는 여전히 00:00 – lukas22ew

+0

을 나타내며 코드를 디버그하고 예상대로 작동하는지 확인해야합니다. 타이머에 전화하고 있니? 적당한 경과 시간으로 우승 했니? – Blau

0

이 시도

TimeSpan Elapsed ; 

    switch (currentGameState) 
    { 
     case GameState.MainMenu: 

      if (btnPlay.isTapped == true) 
      { 
       currentGameState = GameState.Playing; 
       soundEffectInstance.Stop(); 
      } 
      btnPlay.Update(collection); 
      Elapsed = TimeSpan.Zero; 
      break; 

     case GameState.Playing: 

      Elapsed = gametime.ElapsedGameTime; 
      break; 
    } 

내 메소드를 호출 따라서 GameState.MainMenu에서 minutesPlayingsecondsPlaying을 0으로 설정했습니다. 주 Update() 함수 내에서 minutesPlayingsecondsPlaying을 초기화하지 마십시오. 당신은 시간을 표시 할 때

minutesPlaying = 0; 
secondsPlaying = 0; 

switch (currentGameState) 
{ 
    case GameState.MainMenu: 

     if (btnPlay.isTapped == true) 
     { 
      currentGameState = GameState.Playing; 
      soundEffectInstance.Stop(); 
     } 
     btnPlay.Update(collection); 
     break; 

    case GameState.Playing: 

     secondsPlaying += gameTime.ElapsedGameTime.Seconds; 
     if (secondsPlaying >= 60) 
     { 
      minutesPlaying++; 
      secondsPlaying = 0; 
     } 
     break; 
} 

, 단지 minutesPlayingsecondsPlaying를 표시합니다. 추가 변수가 필요하지 않습니다.

그래도 작동하지 않으면 게임이 시작될 때마다 밀리 초 (secondsPlaying += gameTime.ElapsedGameTime.Milliseconds)를 추적하고 값을 1000으로 나누어 초를 표시 할 수 있습니다.