Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Delta时间会导致不平稳的移动_Java_Graphics_Jframe_Timedelta - Fatal编程技术网

Java Delta时间会导致不平稳的移动

Java Delta时间会导致不平稳的移动,java,graphics,jframe,timedelta,Java,Graphics,Jframe,Timedelta,我试图计算delta时间,以便在屏幕上平滑地移动一个圆,而不管帧速率如何。当我运行我的代码时,圆圈会跳动,这意味着增量时间计算不正确,但我在计算中找不到错误。这是密码 主课 import javax.swing.JFrame; public class Main { public static long lastTime; public static double deltaTime; public static void main(String[] args) {

我试图计算delta时间,以便在屏幕上平滑地移动一个圆,而不管帧速率如何。当我运行我的代码时,圆圈会跳动,这意味着增量时间计算不正确,但我在计算中找不到错误。这是密码

主课

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);
    }
}
  • lastTime=0
    可能是一个bug,所以我会修复它。改为使用
    System.nanoTime()
    初始化它

  • 你也在尽可能快地更新。我会使用
    SwingTimer
    或者干脆使用
    Tread.sleep()
    来降低速度,这样屏幕才有时间真正显示。每秒尝试20次以启动


  • 您可能应该测试
    deltaTime
    ==0,因为您第一次尝试该计算时,时间不会正确计算。我尝试了此方法,但即使在第一次计算delta时间后,仍会观察到抖动。绘制方法仅用于绘制。不要在绘制方法中更改类的属性。应该使用setOvalX(…)之类的方法来设置要绘制圆的位置。您也不应该使用“while(true)”循环。对于动画,应该使用摆动计时器。您不应该重新粉刷框架。您只需要重新绘制面板,因为自定义绘制代码就在这里可能是一个bug,所以我会修复它。你也在尽可能快地更新。我会使用SwingTimer,甚至只使用Tread.sleep()来减慢速度,这样屏幕就有时间真正显示。每秒尝试20次启动。@markspace谢谢,成功了。如果你提交你的评论作为答复,我可以接受。