【问题标题】:Thread.sleep() not workingThread.sleep() 不工作
【发布时间】:2015-02-05 13:11:02
【问题描述】:

在尝试让游戏角色在 java 中跳转时,我尝试使用 Thread.sleep() 使图像向上移动 5 个像素,然后等待例如100 毫秒,然后再次向上移动 5 个像素,等等。

相反,当图像需要向上移动 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();
        }
    }
}

我希望我的代码就这么多,如果我应该上传完整的代码,请询问。

提前感谢您的宝贵时间。

【问题讨论】:

  • 如果您正在执行此类编程,我建议您查看“游戏循环”。你不应该在这种模式下那样睡觉。
  • 您正在事件调度线程上睡觉,这不好,因为它会使您的用户界面无响应并且可能不会执行您想要的操作。您可以改用某种计时器(例如,java.swing.Timer)。正如 David Ehrmann 所建议的,您最好研究游戏循环或使用 Java 框架来开发 libgdx 或 Slick2D 等游戏。
  • 谢谢大家,我用java.swing.Timer解决了,现在程序运行流畅了:)

标签: java thread-sleep


【解决方案1】:

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

【讨论】:

  • setBounds 不会重绘,在 raw 中调用 X 次与使用最新值调用一次相同。这正是发生的事情。
【解决方案2】:

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

【讨论】:

  • 那么我的错误日志中不应该有错误吗?代码运行没有错误,只是不像预期的那样。
猜你喜欢
  • 2016-11-09
  • 2023-04-06
  • 2016-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-04
  • 2012-12-15
  • 2013-03-13
相关资源
最近更新 更多