2012-12-28 1 views
1

나는 안드로이드 게임을 쓰고 있습니다. 메인 게임 화면에는 카운트 다운 타이머가 있으며 0에 도달하면 게임이 끝납니다. 아래 코드는 사용자가 처음으로 레벨을 재생할 때 작동합니다. 그러나 사용자가 두 번째 레벨을 재생할 때마다 약 5 번 씩, 생성 된 숫자는 무작위가됩니다. 예를 들어, 30에서 시작한 다음 -15로 이동했습니다. 누구든지이 일을하는 이유를 제안 할 수 있습니까? 그 숫자는 그냥 최대 이동 한 후이 클래스마다 시간을 인스턴스화하지 않는 경우게임용 타이머는 카운트 다운 대신에 난수를 생성합니다.

public class Timer1 { 
int time = 120; 
int counter = 0; 
int startTime = 30; // Change to 2 minutes 
Timer timer; 

boolean end = false; 

World world = new World(); 

public Timer1() { 

} 

public void subtractTime() { 
    startTime = startTime - 15; // Knock off 15 seconds for hint 
} 

public int getTime() { 
    return time; 
} 

public void startTimer() { 
    timer = new Timer(); 
    time = 120; 
    startTime = 30; 
    end = false; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      counter++; 
      time = startTime - counter; 
      if (time == 0) { 
       world.gameOver = true; 
       end = true; 
       timerCancel(); 
      } 
     } 
    }, 0, 1000); 
} 

public void timerCancel() { 
    timer.cancel(); 
} 

} 
+0

은 스레드 유형의 TimerTask입니까? 그러면 문제가되어야합니다. –

답변

1

당신은, 0에 카운터를 재설정하지 않습니다.

public void startTimer() { 
    timer = new Timer(); 
    time = 120; 
    startTime = 30; 
    counter = 0; // NEW CODE 
    end = false; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     public void run() { 
      counter++; 
      time = startTime - counter; 
      if (time == 0) { 
       world.gameOver = true; 
       end = true; 
       timerCancel(); 
      } 
     } 
    }, 0, 1000); 
} 

그러나 무엇을하는지는 startTimer를 호출하는 것입니다.하지만 '타이머 재설정'입니다. 즉 모든 변수를 재설정하면 다음 타이머를 시작합니다. 매번 new Timer1().startTimer()을 방금하면 쉽게 유지 보수를 읽을 수 있습니다.

또한 수학이 꺼져 있고 시간이 0이 아니지만 이 0보다 작 으면 타이머는입니다. 조심해. if (time == 0) {

이 시도 : 당신은 counter를 재설정하지 않는

if (time <= 0) { 
+0

대단히 고마워요. 나는 당신이 제안한 변화를 만들었고 효과가있다. 시간을내어 주셔서 감사합니다. – user1934377

0

. time == 0 인 경우 레벨을 종료하므로 종료 조건에 도달하지 않습니다.

또한 TimerTask이 1 초마다 호출된다고 가정합니다. 일반적으로이 가정은 거짓입니다. 게임에 CPU 시간이 필요한 경우 TimerTask의 실행이 지연 될 수 있습니다. 그러므로 시작시 시스템 시간 (System.currentTimeMillis())을 기억하고 얼마나 많은 시간이 경과했는지에 따라 연속적으로 TimerTask 번을 호출 할 때마다 카운터 대신 시간이 초과되었는지 확인하십시오.

+0

감사합니다. 나는 시스템 시간 등을 얻는 접근법을 시도했지만 그저 작동시키지 못했습니다. 시간이 정확하지 않은 경우 중요하지 않으므로 변경하지 않을 것입니다. – user1934377

0

HandlerHandler.postDelayed 방법을 사용하면 코드가 훨씬 쉬울 것입니다.

Android Docu

+0

내가 읽은 두 개의 Android 책에는 Handler에 대한 언급이 없습니다. 나는 더 많은 것을 찾아야 할 것입니다. 도와 주셔서 감사합니다. – user1934377

관련 문제