我已经看到了这个问题的其他几个答案,但所有这些帖子似乎都有我的代码没有的问题。 (每次调用paintComponent()
方法时都会创建一个计时器,另一个有一个始终为true的布尔值,所以我认为总是在每个循环上创建一个计时器。)
我基本上写的是BrickBreaker的一个版本。我希望用户在游戏重置之前有5个生命。我在我的计时器处理程序类中有checkForOutOfBounds()
调用的方法actionPerformed()
,如果球落在屏幕底部,它会减少生命数并将球返回到其初始位置。由于某种原因,计时器在每次调用此方法后开始加速,即使在通过这些方法和他们调用的方法反复查看之后,我也无法找到计时器受影响的位置。以下是我项目的相关代码。这一切都在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
首次初始化时(在主方法中)被调用,因此它不应该在任何其他点创建新的计时器。