Java与KeyEvent在突破中的流畅移动

问题描述

我目前正在通过斯坦福大学的《编程方法论》(2008年)课程学习Java。我正在尝试创建游戏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(acceleration(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,如果按下相应的键,则将它们设置为 true。之后,我使用以下命令移动桨:if (left_key_down) move (-5,0) 并且类似地以正确的动作移动。这导致了平滑的运动。