【发布时间】:2018-05-20 17:48:36
【问题描述】:
我正在尝试计算增量时间,以便在屏幕上平滑移动一个圆圈,无论帧速率如何。当我运行我的代码时,圆圈抖动,这意味着增量时间没有正确计算,但我在计算中找不到错误。这是代码
主类
import javax.swing.JFrame;
public class Main {
public static long lastTime;
public static double deltaTime;
public static void main(String[] args) {
lastTime = 0;
//Setting up the JFrame
JFrame frame = new JFrame("Test");
frame.setSize(600, 400);
frame.add(new PanelP());
frame.setVisible(true);
//Loop
while(true) {
//Calculate DeltaTime
deltaTime = (lastTime - (lastTime = System.nanoTime())) / -1000000.0;
//Draw Frame
frame.repaint();
}
}
}
还有面板类
import java.awt.Graphics;
import javax.swing.JPanel;
public class PanelP extends JPanel{
private float x;
public PanelP() {
super();
}
@Override
public void paintComponent(Graphics g) {
//Move circle
x += (10 * (float)Main.deltaTime);
//Draw Circle
g.drawOval(Math.round(x), 50, 30, 30);
}
}
【问题讨论】:
-
您可能应该测试
deltaTime== 0,因为您第一次尝试该计算时将无法正确计算时间。 -
我试过这个,但即使在第一次增量时间计算之后,仍然可以观察到抖动。
-
一种绘画方法,仅供绘画使用。不要在绘画方法中更改类的属性。你应该有一个像 setOvalX(...) 这样的方法来设置你想要画圆的位置。您也不应该使用“while (true)”循环。对于动画,您应该使用 Swing Timer。你不应该重新粉刷框架。您只需要重新绘制面板,因为这是您自定义绘制代码的地方。
-
好吧
lastTime = 0;可能是一个错误,所以我会修复它。您也在尽可能快地进行更新。我会使用 SwingTimer 甚至只是 Tread.sleep() 来减慢速度,以便屏幕有时间实际显示。每秒尝试 20 次以开始。 -
@markspace 谢谢,那行得通。如果您提交您的评论作为答案,我可以接受。
标签: java graphics jframe timedelta