1

我正在写一个安卓游戏。主游戏屏幕有一个倒数计时器,当它到达零时,游戏结束。下面的代码在用户第一次玩关卡时工作。然而,大约每五次用户玩第二关,产生的数字就会变得随机,例如,它刚从 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();
}

}
4

3 回答 3

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) {

试试这个:

 if (time <= 0) {
于 2012-12-28T12:06:23.810 回答
0

您没有重置counter. 如果time == 0未达到终止条件,您将结束关卡。

此外,您假设TimerTask每秒钟都会调用一次。一般来说,这个假设是错误的。如果您的游戏需要 CPU 时间,则TimerTask的执行可能会延迟。因此,请考虑在 start ( ) 上记住系统时间,System.currentTimeMillis()并检查每次连续调用TimerTask已经过去了多少时间,并根据该时间而不是计数器来决定时间是否到了。

于 2012-12-28T12:18:03.840 回答
0

Handler如果您使用 a和方法,您的代码会容易得多Handler.postDelayed

看看安卓文档

于 2012-12-28T12:24:53.987 回答