java中的计时器正在加速,即使它';它只创建了一次
我已经看到了这个问题的其他几个答案,但所有这些帖子似乎都有我的代码没有的问题。(一个是每次调用java中的计时器正在加速,即使它';它只创建了一次,java,swing,timer,Java,Swing,Timer,我已经看到了这个问题的其他几个答案,但所有这些帖子似乎都有我的代码没有的问题。(一个是每次调用paintComponent()方法时都会创建计时器,另一个是布尔值,始终为true,因此我认为每个循环都会创建一个计时器) 我写的基本上是一个版本的砌砖机。我希望用户在游戏重置前有5次生命。在计时器处理程序类中,我有一个由actionPerformed()调用的方法checkForOutOfBounds(),该方法减少生命数,并在球从屏幕底部掉出时将球返回其初始位置。出于某种原因,每次调用此方法后,计
paintComponent()
方法时都会创建计时器,另一个是布尔值,始终为true,因此我认为每个循环都会创建一个计时器)
我写的基本上是一个版本的砌砖机。我希望用户在游戏重置前有5次生命。在计时器处理程序类中,我有一个由actionPerformed()
调用的方法checkForOutOfBounds()
,该方法减少生命数,并在球从屏幕底部掉出时将球返回其初始位置。出于某种原因,每次调用此方法后,计时器都会开始加速,尽管在反复查看这些方法及其调用的方法后,我根本找不到计时器受到影响的地方。下面是我的项目中的相关代码。这都在GameFrame
类中,它扩展了JFrame
。谢谢大家!
protected int lives = 5;
protected Life Life1, Life2, Life3, Life4, Life5;
protected boolean[] livesBooleanArray;
...
protected class GameCanvas extends JPanel {
public GameCanvas() {
setFocusable(true);
}
@Override
public void paintComponent(Graphics g) {
paddle.draw(g);
ball.draw(g);
if (livesBooleanArray[0]) {
Life1.draw(g);
}
if (livesBooleanArray[1]) {
Life2.draw(g);
}
if (livesBooleanArray[2]) {
Life3.draw(g);
}
if (livesBooleanArray[3]) {
Life4.draw(g);
}
if (livesBooleanArray[4]) {
Life5.draw(g);
}
}
}
protected void setUpTimer() {
timer = new Timer(TIMER_DELAY, new TimerHandler());
}
protected class TimerHandler implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("TimerHandler.actionPerformed()");
ball.t += .1;
checkForOutOfBounds();
ball.update();
paddle.update();
canvas.repaint();
System.out.println(ball.t);
}
}
public void checkForOutOfBounds() {
if ((ball.y_pos + ball.getHeight()) >= getHeight()) {
int x = (int)(0.5*getHeight());
int y = (int)(0.25*getHeight());
ball.setLocation(x, y);
updateLives();
}
else {}
}
public void updateLives() {
lives --;
livesBooleanArray[lives] = false;
if (lives == 0) {
resetScreen();
}
}
public void resetScreen() {
int x = (int)(0.5*getHeight());
int y = (int)(0.25*getHeight());
ball.setLocation(x, y);
lives =5;
setUpLives();
timer.restart();
}
setUpTimer()
仅在GameFrame
首次初始化(在main方法中)时调用,因此它不应该在任何其他点创建新计时器。是否在setUpTimer
中设置断点以确保只调用一次?您是否在TimerHandler.actionPerformed
中设置了断点,并检查了e.getSource()
是否每次都是相同的计时器
?只有当e.getSource()是最初初始化的计时器时,当我使actionPerformed()中的所有代码都执行时,它仍然会加速。我放入一条语句来打印事件,它打印:“javax.swing上的java.awt.event.ActionEvent[unknown type,cmd=null,when=1460397513714,modifiers=]。Timer@3192c4d6“,每一次,这意味着它是同一个计时器,对吗?(每次运行计时器的地址都相同)确保在执行任何自定义绘制之前调用super.paintComponent,以防止可能出现的图形故障。要更快地获得更好的帮助,请发布或。