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