因此,我需要帮助以使我的角色移动更平稳。
问题在于,当我按下一个键时,角色会移动一个像素,然后一秒钟后,他会“平稳地”运行。我该如何解决它,这样我就不必等待一秒钟,而他从一开始就可以平稳运行?
感谢您的帮助和感谢!

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) {

最佳答案

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

第一次按下keyPressed时,它还会有一个初始延迟,介于第一次和重复击键之间,这可以通过在按下和释放键时设置一个标志来克服。有关更多详细信息,请参见this example

不要在update中调用paintComponent,可能由于多种原因而发生绘画,而您可能无法控制这些原因,这可能会导致保持平滑动画的问题。

相反,您需要一个“主”循环,该循环负责更新状态并计划重绘。作为一个简单的解决方案,您可以使用Swing Timer进行此操作,因为它是从内部更新UI的状态而不会冒其他线程问题的风险。

有关更多详细信息,请参见How to use Swing Timers

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

关于java - 如何使运动更平稳?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43844824/

10-11 14:23