我正在写一款Android游戏。主游戏屏幕有一个倒数计时器,当它达到零时游戏结束。下面的代码在用户第一次播放关卡时起作用。然而,大约每五次用户播放第二级时,产生的数字变得随机,例如,它从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 :(得分: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) {
答案 1 :(得分:0)
您没有重置counter
。如果time == 0
未达到终止条件,则结束等级。
此外,您假设标记上每秒都会调用TimerTask
。通常,这种假设是错误的。如果您的游戏需要CPU时间,TimerTask
的执行可能会延迟。因此,请考虑记住启动时的系统时间(System.currentTimeMillis()
),并检查每次连续调用TimerTask
已经过了多长时间,并根据该时间而不是计数器来确定时间是否到了。
答案 2 :(得分:0)
如果您使用Handler
和Handler.postDelayed
方法,您的代码会更容易。