如何使运动更平滑?
所以我需要帮助才能让我的角色更流畅地移动。 问题在于,当我按下某个键时,角色移动了一个像素,之后像一秒钟“顺利”运行。我该如何解决这个问题,以便我不需要等待一秒钟,并且从一开始就平稳运行? 我很感谢任何帮助和感谢!如何使运动更平滑?
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) {
这是因为你的update
方法不正确。在您的情况下,您使用=
运营商而不是==
。
if (KB[0] = true)
将分配给true
和KB[0]
评估它作为true
,因此所有的值将被设置为true,你if
内。除非要分配值,否则在将其用作条件时将=
更改为==
。
啊,我看到谢谢!它帮助我了!顺便说一句,你知道如何在我的代码中使用计时器吗?将不胜感激,因为我的老师希望我有一个:D –
@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)``使用第一种形式消除了偶然发生这些类型错误的可能性
感谢您的帮助! –
'或者只是'if(KB [0])' – samgak
为什么'keyPressed'中有不同的逻辑? PS:在'paintComponent'中调用repaint()可能不是最好的想法 – AxelH
您需要使用Swing Timer来控制动画。请参阅[使用键盘的动作](https://tips4java.wordpress.com/2013/06/09/motion-using-the-keyboard/)。 ''KeyboardAnimation.java'示例显示了如何使用'Swing Timer'来实现可以控制的流畅动画。 – camickr