当前位置: 首页 > 知识库问答 >
问题:

Java突破中的KeyEvents平滑移动

衡翰翮
2023-03-14

我目前正在通过斯坦福大学的编程方法论(2008)课程学习Java。我正在试图创建游戏突破,并试图目前动画桨,这是一个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);
    }

问题是,如果我用鼠标移动拨片,它会很好地跟随,比我用键盘移动它要流畅得多。改变移动()方法中的值只会改变拨片移动的速度。

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

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;

在这之后,我就开始划桨了。移动(加速度(5),0)而不是划桨。移动(5,0)。我还添加了KeyRelease方法,将速度设置为初始值:

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

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

共有1个答案

狄元魁
2023-03-14

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

我没有直接用侦听器移动拨片,而是创建了两个布尔值:left_key_downright_key_down,如果按下相应的键,将它们设置为true。之后,我使用:if(left_key_down)mobile(-5,0)移动拨片,类似地使用右运动。这导致了平滑的运动。

 类似资料:
  • 问题内容: 递归是一种“分而治之”的样式,它在变小的同时会拆分(Tree数据结构),如果发现违规,我希望它完全中断,这意味着中断所有递归路径并返回true。这可能吗? 问题答案: 您可以返回错误代码,或修改一些全局变量,以便每个递归实例都知道可以“杀死自己”。 某种东西。

  • 问题内容: 在我的代码中,我有一个for循环,迭代一个代码方法,直到满足for条件为止。 反正有没有打破这个for循环? 因此,如果我们看下面的代码,如果我们想在达到“ 15”时打破这个for循环,该怎么办? 我尝试了以下无济于事: 我尝试了一个循环: 我可以实现我想要的唯一方法是打破for循环,我不能暂时将其替换,如果要使用if语句。 编辑: 仅作为示例提供了此代码,这不是我试图将其实现的代码。

  • 我正在创建一个突破游戏,我之前在这里问了一个问题,但没有提出解决方案。我有一个简单的物理过程来反转球与桨碰撞时的速度。但我需要实现一个更先进的物理系统,例如,当球击中桨的左侧和右侧时,等等。。。但我该如何计算碰撞后球的方向呢?突破的标准是在与球拍左侧碰撞时将球指向左侧,如果碰撞是向右的,则指向右侧,等等。。。 我如何计算在哪里击球?我有很多变量可以使用,比如桨叶的各个方面(宽度、高度、X位置)、球

  • 问题内容: 我有一个像这样的嵌套循环构造: 现在如何摆脱两个循环?我看过类似的问题,但没有一个是Java特有的。我无法应用这些解决方案,因为大多数使用的gotos。 我不想将内部循环使用其他方法。 我不想重新运行循环。中断时,我完成了循环块的执行。 问题答案: 像其他答复者一样,我绝对希望将循环放入另一种方法中,此时你可以返回以完全停止迭代。该答案仅显示了如何满足问题中的要求。 你可以将break

  • 问题内容: 我的Java应用程序中有一个JFrame,其中包含一个在运行时创建的图形对象。问题是,在滚动大号图形时,滚动速度会变慢,并且滚动条无法平滑移动。请注意,我正在使用对象,并且正在执行滚动操作。 有什么办法可以使的滚动动作变得平滑。 这是代码的一部分 问题答案: 为什么不将图形放在(大的)图形中并在滚动窗格的标签中显示?像这样的东西(动画,5000x5000px): 它试图每秒绘制200线

  • 我目前正在尝试使用java和libgdx制作一个突破性的克隆。我现在很难让球以合适的角度从挡块上弹起。简而言之,我遇到的问题是,球每帧移动12个像素,并不总是与砖的边缘对齐。如果有人对更好的移动球的方法或其他检查碰撞的方法有任何建议,我们将不胜感激! 主要游戏类 Ball类 砖块代码以防万一