定时器在java中加速,即使它只创建一次

时间:2016-04-11 17:46:14

标签: java swing timer

我已经看到了这个问题的其他几个答案,但所有这些帖子似乎都有我的代码没有的问题。 (每次调用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首次初始化时(在主方法中)被调用,因此它不应该在任何其他点创建新的计时器。

0 个答案:

没有答案