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