2015-02-05 29 views
0

虽然试图在java中制作游戏角色跳跃,但我尝试使用Thread.sleep()使图像向上移动5个像素,然后等待100毫秒,然后再向上移动5个像素等。Thread.sleep()不工作

相反,当图像需要做5个像素,每个5个像素,每次等待100毫秒,它等待500毫秒,并向上移动25个像素。

我无法解释这种行为,似乎没有在线答案。请注意,我的程序不包含线程。这里是我的代码:

ImageIcon poppetje1   = new ImageIcon("img/poppetje1.jpg"); 
JLabel poppetje2   = new JLabel(poppetje1); 

... 

public void jump() { 
    try { 
     poppetje2.setBounds(poppetje2.getX(), (poppetje2.getY()-5), poppetje1.getIconWidth(), poppetje1.getIconHeight()); 
     Thread.sleep(100); 
    } catch(InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

... 

public void keyPressed(KeyEvent e) { 
    if(e.getKeyCode() == KeyEvent.VK_W) { 
     for(int c = 0; c < 10; c++) { 
      jump(); 
      repaint(); 
     } 
    } 
} 

我希望这是足够的我的代码,如果我应该上传完整的代码,请问。

提前感谢您的时间。

+1

如果你正在进行这种编程,我建议寻找“游戏循环”。在这种模式下,你不应该像那样睡觉。 – 2015-02-05 13:12:44

+1

您在事件调度程序线程中休眠,这不太好,因为它会让您的用户界面无法响应,并且可能不会执行您想要的操作。您可以使用某种计时器(例如,java.swing.Timer)。正如David Ehrmann所建议的那样,您可以更好地研究游戏循环,或者使用像libgdx或Slick2D这样的游戏的Java框架。 – 2015-02-05 13:16:27

+0

谢谢大家,我使用java.swing.Timer解决了这个问题,程序现在运行平稳:) – kevinvdk 2015-02-05 13:47:41

回答

0

也许你在这行代码poppetje2.setBounds(poppetje2.getX(), (poppetje2.getY()-5), poppetje1.getIconWidth(), poppetje1.getIconHeight());中得到一个异常,它直接跳到catch语句。

+0

不应该在我的错误日志中出现错误吗?该代码运行没有错误,只是不像预期的那样。 – kevinvdk 2015-02-05 13:16:43

2

setBounds是否包含重绘/渲染步骤?如果没有,在keyPressed内阻塞可能会阻止重新发生,直到睡眠完成并keyPressed返回。

+0

'setBounds'不重绘,在raw中调用它X次与使用最新值调用它一次相同。这到底发生了什么。 – 2015-02-05 13:21:35

相关问题