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_down
和right_key_down
,如果相应的键被按下,则将它们设置为真。之后,我使用以下方式移动桨: if (left_key_down) move (-5,0)
并且类似地向右移动。这导致了平滑的运动。
我目前正在学习 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_down
和right_key_down
,如果相应的键被按下,则将它们设置为真。之后,我使用以下方式移动桨: if (left_key_down) move (-5,0)
并且类似地向右移动。这导致了平滑的运动。