游戏循环不起作用

Posted

技术标签:

【中文标题】游戏循环不起作用【英文标题】:Game loop doesn't work 【发布时间】:2016-07-22 11:26:22 【问题描述】:
boolean running = false;
Rectangle rect = new Rectangle(10, 10, 80, 80);
JButton b = new JButton("Misca-te!");;
boolean shouldClearRect = false;
String path = new String();
BufferedImage i;
int x = 0;
double a = x;
boolean q = true;
public Thread th;

public void paintComponent(Graphics g)
    super.paintComponent(g);
    this.setBackground(Color.RED);

    g.drawImage(i, x, 0, null);
    path = "/Xture/apple.png";
    i = game2.loadImage(path);
    this.add(b);    


public void update()
    x+= 1;


public void run()
    int fps = 60;
    double timepertick = 1000000000 / fps;
    double delta = 0;
    long now;
    long lasttime = System.nanoTime();
    long timer = 0;
    int ticks = 0;

    while(true)
        now = System.nanoTime();
        delta += (now - lasttime)/ timepertick;
        timer += now - lasttime;
        lasttime = now;

        if(delta >= 1)
            update();
            ticks++;
            delta--;
        
        if(timer >= 1000000000)
            System.out.println(ticks);
            ticks = 0;
            timer = 0;
        
    


public void start()
    running = true;
    th = new Thread(this);
    th.start();


public static BufferedImage loadImage(String path)
    try 
        return ImageIO.read(game2.class.getResource(path));
     catch (IOException e) 
        e.printStackTrace();
        System.exit(1);
    
    return null;

此代码需要将图像每秒移动 1 个像素。但如果我运行它,它会一次移动超过 1 个像素然后停止,但它每秒都会在控制台中写入“60 fps”。是我的代码有问题,还是我的笔记本电脑有问题?

P.S.:JFrame 在主类中

【问题讨论】:

大胆猜测:问题出在您的代码中,而不是在您的笔记本电脑上。 @m0skit0 有史以来最大的情节转折。 【参考方案1】:

我认为如果你这样做会更简单:

public void run()
    int fps = 1;
    double delay = 1000 / fps;
    int ticks = 0;
    while(true)
        delay();
        update();
        System.out.println(++ticks);
       


public void delay(int mil)
    try
        Thread.Sleep(mil);
    catch(Exception e)

    

【讨论】:

哇,这是什么循环? @eldo 每次while块循环线程都会休眠一段时间(休眠时间为1000/fps),然后做它应该做的事情。

以上是关于游戏循环不起作用的主要内容,如果未能解决你的问题,请参考以下文章

使用 foreach 循环的简单查询不起作用,但不起作用

fillOval() 在 if 语句中不起作用[关闭]

使用 SDL 和 openGL 绘图原语不起作用

即时游戏广告不起作用 - showAsync' 为 null

按钮 ClickListener 在 LibGDX 游戏中不起作用

为啥这个循环不起作用?