JAVA GAME循环?

时间:2015-12-25 21:50:47

标签: java image swing loops java-2d

我的java游戏有问题。我是初学者,但我必须把它写成一个学校项目 游戏被称为“生日蛋糕”,蛋糕上有7个蜡烛,其中一个正在显示为30秒,在这段时间你必须点击它才能得到点,如果你在这段时间没有点击它下一支蜡烛将显示。 10个蜡烛显示时游戏结束 我做了循环,我试图让它工作太久,以至于我因挫折感而死亡 我的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;

        }

2 个答案:

答案 0 :(得分:5)

  

此循环位于JPanel paintComponent ...

从不,
从不,

NEVER

Thread.sleep(...) 内召唤paintComponent 。请理解,此方法在很大程度上决定了程序的感知响应能力,任何减慢程序速度或冻结它的程序都会严重降低和冻结GUI。实际上你永远不应该在大多数Swing程序的代码中调用Thread.sleep(所有这些都在Swing事件线程上运行),但是在paintComponent中这样做是更糟糕的罪。解决方案是使用Swing Timer,并在Timer的ActionListener的actionPerformed代码中定期重复调用您想要被调用的代码。在此方法中,更改类中字段所持有的值,例如wspX和wspY,调用repaint(),然后使用paintComponent中的那些字段来确定在哪里绘制的内容。

答案 1 :(得分:0)

Thread.sleep()是一个糟糕的调用,可能导致很多问题。我被告知永远不要使用它。相反,我会告诉你我做游戏循环的方式。它可能不是完美的游戏循环,但它很好。

我建议实现runnable并将循环放在run方法中。

 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。