如何使运动更平滑?

问题描述:

所以我需要帮助才能让我的角色更流畅地移动。 问题在于,当我按下某个键时,角色移动了一个像素,之后像一秒钟“顺利”运行。我该如何解决这个问题,以便我不需要等待一秒钟,并且从一开始就平稳运行? 我很感谢任何帮助和感谢!如何使运动更平滑?

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

'或者只是'if(KB [0])' – samgak

+0

为什么'keyPressed'中有不同的逻辑? PS:在'paintComponent'中调用repaint()可能不是最好的想法 – AxelH

+0

您需要使用Swing Timer来控制动画。请参阅[使用键盘的动作](https://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/)。 ''KeyboardAnimation.java'示例显示了如何使用'Swing Timer'来实现可以控制的流畅动画。 – camickr

这是因为你的update方法不正确。在您的情况下,您使用=运营商而不是==

if (KB[0] = true) 

将分配给trueKB[0]评估它作为true,因此所有的值将被设置为true,你if内。除非要分配值,否则在将其用作条件时将=更改为==

+0

啊,我看到谢谢!它帮助我了!顺便说一句,你知道如何在我的代码中使用计时器吗?将不胜感激,因为我的老师希望我有一个:D –

+0

@MushiMushi欢迎您,您可以看看这个小教程:https://docs.oracle.com/javase/tutorial/uiswing/misc/timer。 HTML。如果我的答案帮助你解决了问题,那么你可能想要接受它作为正确的答案。 –

我建议不要使用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),因为=是一项任务,而非评估。如果(KB [0] = true)`应该是'if(KB [0] == true)``使用第一种形式消除了偶然发生这些类型错误的可能性

+0

感谢您的帮助! –