JAVA 游戏循环?

JAVA GAME loop?

我的 java 游戏有问题。我是初学者,但我必须把它写成学校项目。
游戏名为“生日蛋糕”,蛋糕上有 7 支蜡烛,其中随机一支会显示 30 秒,在此期间你必须点击它才能获得积分,如果你在此期间不点击它下一根蜡烛将显示。当出现 10 个蜡烛时游戏结束。
我做了 for 循环,我试图让它工作太久,以至于我快要沮丧死了
我的 for 循环有效,但它是如此之快,以至于我使用 Thread.sleep(1000),我尝试了很多看起来不错的解决方案。但是当我开始游戏时什么也没有发生,几秒钟后所有 7 根蜡烛都亮起并迅速消失。我想我做错了什么,但我不知道是什么。

   if(Dane.start){

        int liczbaLosowa = 0;

        for(int i=0; i<10 ;i++){
            liczbaLosowa = (int)(Math.random()*7);

            this.wspX= wspX_p[liczbaLosowa];
            this.wspY= wspY_p[liczbaLosowa];
            g2d.drawImage(plomienImg, wspX, wspY,null);
            Toolkit.getDefaultToolkit().sync();
            try {
                Thread.sleep(1000);     
            } catch (Exception ex) { }
            //repaint();
        }
        Dane.start=false;

        }

this loop is inside JPanel paintComponent...

从不,
从不,

从不

paintComponent ever 内调用 Thread.sleep(...)。请理解,此方法在很大程度上决定了您的程序的感知响应能力,任何减慢或冻结它的事情都会严重减慢并冻结您的 GUI。事实上,您永远不应该在大多数 Swing 程序(所有在 Swing 事件线程上运行的程序)的代码中调用 Thread.sleep,但在 paintComponent 中这样做是更严重的错误。解决方案是使用Swing Timer,并将您希望定期重复调用的代码放在Timer 的ActionListener 的actionPerformed 代码中。在此方法中,更改 class 中的字段所持有的值,例如 wspX 和 wspY,调用 repaint(),然后使用 paintComponent 中的这些字段来确定在何处绘制内容。

Thread.sleep() 是一个错误的调用,会导致很多问题。有人告诉我永远不要使用它。相反,我将向您展示我进行游戏循环的方式。它可能不是完美的游戏循环,但它很好。

我建议实现 运行nable 并将循环放入 运行 方法中。

 public void run(){

    init(); //initialisation of images, sound..etc. will be executed once only

    int fps = 60 //number of update per second.
    double tickPerSecond = 1000000000/fps;
    double delta = 0;
    long now;
    long lastTime = System.nanoTime();

    while(running){

        now = System.nanoTime();
        delta += (now - lastTime)/tickPerSecond;
        lastTime = now;

        if(delta >= 1){

            tick();
            render();
            delta--;
        }
    }
}

private void init(){

  //initialisation image, sound, loading world, generate maps....etc
}

private void tick(){

  //tick player, world, entities..etc
}

private void render(){

  //render graphics.  
}

也不要忘记为线程创建启动和停止方法。您可以将 fps 更改为您想要的数字,无需高于 60。