Java 在突破中使用 KeyEvents 平滑移动

Java smooth movement with KeyEvents in breakout

我目前正在学习 Java 斯坦福大学的编程方法论 (2008) 课程。我正在尝试创建游戏 Breakout 并正在尝试为球拍设置动画,这是一个 GRect 类型的对象。这是我的代码:

// moves paddle via keyboard
public void keyPressed(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_RIGHT && paddle.getX() < getWidth() - paddle.getWidth()) {
        paddle.move(5, 0);
    }
    if (key == KeyEvent.VK_LEFT && paddle.getX() > 0) {
        paddle.move(-5, 0);
    }
}


//moves paddle via mouse
public void mouseMoved(MouseEvent e) {
    while (e.getX() > paddle.getX() + PADDLE_WIDTH/2 && paddle.getX() < getWidth() - PADDLE_WIDTH) {
        paddle.move(1, 0);
    }
    while (e.getX() < paddle.getX() + PADDLE_WIDTH/2 && paddle.getX() > 0) {
        paddle.move(-1, 0);
    }

问题是,如果我用鼠标移动球拍,它会跟随得很好,比我尝试用键盘移动它更顺畅。更改 move() 方法中的值只会更改球拍移动的速度。

我试过谷歌搜索,人们所做的其中一件事是逐渐增加和减少桨的移动速度,但我不确定如何通过这个库正确地实现它。这是我的尝试:

private double acceleration(double finalSpeed) {
    if (finalSpeed > initialSpeed) {
        initialSpeed += delta;
    } else if (finalSpeed < initialSpeed) {
        initialSpeed -= delta;
    } 
    return initialSpeed;

}

private double initialSpeed = 0;
private double delta = 0.5;

在此之后我只设置了 paddle.move(加速度(5),0) 而不是 paddle.move (5,0)。我还添加了将速度设置为初始值的 KeyReleased 方法:

public void keyReleased(KeyEvent e) {
    int key = e.getKeyCode();
    if (key == KeyEvent.VK_RIGHT || key == KeyEvent.VK_LEFT) {
        initialSpeed = 0;
    }

但是,当我在左右箭头键之间切换时,拨片的移动没有​​反应。开始向另一个方向移动大约有 0.5 秒的延迟,我花了一整天试图找出解决方案但无济于事。请给我任何提示,谢谢!

线程似乎有问题(我不太明白)。这样做有帮助:

我没有直接用听众移动桨,而是创建了两个布尔值:left_key_downright_key_down,如果相应的键被按下,则将它们设置为真。之后,我使用以下方式移动桨: if (left_key_down) move (-5,0) 并且类似地向右移动。这导致了平滑的运动。