【问题标题】:How do I make smoother movement?如何使运动更顺畅?
【发布时间】:2017-05-08 10:04:04
【问题描述】:

所以我需要帮助让我的角色移动得更顺畅。 问题是当我按下一个键时角色移动了一个像素,然后在一秒钟后他“顺利”地运行。我该如何解决它,这样我就不需要等待那一秒钟,而他从一开始就顺利运行? 在此之前,我感谢任何帮助和感谢!

public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.setColor(Color.GREEN);
    g.fillRect(x, y, 30, 30);
    update();
}
private boolean[] KB = new boolean[4];
public void update(){ 
    if(KB[0] = true)
    {
        y -= 10;
    }
    if(KB[1] = true)
    {
        x -= 10;
    }
    if(KB[2] = true)
    {
        y += 10;
    }
    if(KB[3] = true)
    {
        x +=10;
    }
    repaint();
}

public void keyPressed(KeyEvent e) {
    if(e.getKeyCode() == KeyEvent.VK_W)
    {
        KB[0] = true;
    }
    if(e.getKeyCode() == KeyEvent.VK_A)
    {
        x -= 10;
    }
    if(e.getKeyCode() == KeyEvent.VK_S)
    {
        y += 10;
    }
    if(e.getKeyCode() == KeyEvent.VK_D)
    {
        x += 10;
    }
}
public void keyReleased(KeyEvent e) {

}

public void keyTyped(KeyEvent e) {

【问题讨论】:

  • if(KB[0] = true) 应该是 if(KB[0] == true) 吗?或者只是if(KB[0])
  • 为什么keyPressed 有不同的逻辑? PS:在paintComponent 中调用 repaint() 可能也不是最好的主意
  • 您需要使用Swing Timer 来控制动画。见Motion Using the KeyboardKeyboardAnimation.java 示例展示了如何使用 Swing Timer 实现您可以控制的流畅动画。

标签: java swing game-physics paintcomponent


【解决方案1】:

我建议不要使用KeyListener,建议使用How to Use Key Bindings,它将解决与KeyListener 相关的焦点问题,并提供更可重用的解决方案。

keyPressed 在第一次按下时也会有一个初始延迟,在第一次和重复击键之间,这可以通过在按下和释放键时设置一个标志来克服。详情请见this example

不要在您的paintComponent 中调用update,绘画可能由于多种原因而发生,其中可能是您​​无法控制的,这可能会导致维持流畅动画的问题。

相反,您需要一个“主”循环来负责更新状态和安排重绘。作为一个简单的解决方案,您可以使用 Swing Timer 来执行此操作,因为它可以从内部更新 UI 的状态,而不会有额外的线程问题的风险

查看How to use Swing Timers了解更多详情。

如前所述,使用if(KB[0]) 而不是if(KB[0] = true),因为= 是分配,而不是评估。使用第一种形式消除了意外犯此类错误的可能性

【讨论】:

  • 感谢您的帮助!
【解决方案2】:

这是因为您的update 方法不正确。在您的条件下,您使用 = 运算符而不是 ==

if (KB[0] = true)

会将true 分配给KB[0] 并将其评估为true,因此您在if 中的所有值都将设置为true。将= 用作条件时将= 更改为==,除非您要分配值。

【讨论】:

  • 啊,我明白了,谢谢!它帮助了我!顺便说一句,您知道我如何在您的代码中使用计时器吗?会很感激,因为我的老师希望我有一个:D
  • @MushiMushi 欢迎你,你可以看看这个小教程:docs.oracle.com/javase/tutorial/uiswing/misc/timer.html。如果我的回答帮助您解决了问题,那么您可能希望接受它作为正确答案。
猜你喜欢
  • 1970-01-01
  • 2013-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多