【问题标题】:Java smooth movement with KeyEvents in breakoutJava 在突破中使用 KeyEvents 平滑移动
【发布时间】:2021-02-17 21:34:02
【问题描述】:

我目前正在通过斯坦福的 Programming Methodology (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 秒的延迟,我花了一整天的时间试图找出解决方案,但无济于事。请给我任何提示,谢谢!

【问题讨论】:

    标签: java animation keylistener keyevent breakout


    【解决方案1】:

    似乎线程有问题(我不完全理解)。这样做有帮助:

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

    【讨论】:

      猜你喜欢
      • 2017-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 2017-11-07
      • 1970-01-01
      相关资源
      最近更新 更多