2015-12-25 276 views
-5

我的Java遊戲有問題。我是初學者,但我必須把它寫成一個學校項目。
遊戲被稱爲「生日蛋糕」蛋糕上有7個蠟燭,隨機一個顯示爲30秒,在這段時間內你必須點擊它才能獲得點數,如果你沒有點擊它這次下一個蠟燭會顯示。遊戲結束時,10個蠟燭顯示。
我做了循環,我試圖讓它工作很長時間,我從沮喪中死亡
我for循環的作品,但它是如此之快,我使用Thread.sleep(1000),我試了很多解決方案看起來不錯。但是當我開始我的比賽時沒有任何事情發生,幾秒鐘後,所有7支蠟燭都會顯示並迅速消失。我認爲我做錯了什麼,但我不知道是什麼。JAVA遊戲循環?

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; 

     } 
+0

這是Swing嗎?它是在Swing事件線程上調用的嗎?該代碼看起來像1)讓你的整個圖形用戶界面進入休眠狀態,2)由於濫用圖形對象而拋出NullPointerExceptions。如果是Swing,可以通過使用JPanel的paintComponent方法內部的Graphics對象,或者更好的方法來解決這個問題,包括使用Swing Timer,或者更好地交換JLabel的ImageIcons。請給我們更多信息,並幫助我們更好地理解您的問題和代碼。 –

+0

是的,它是在Swing上,這個循環在JPanel paintComponent裏面,我使用BufferedImage加載圖像 – Miszel

+0

Google上有很多關於從簡單到複雜的遊戲循環。 – Steven

回答

5

,此環的JPanel的paintComponent裏面......

從來沒有,
從來沒有,

NEVER

通話Thread.sleep(...)paintComponent裏面過。請理解,這種方法在很大程度上決定了程序的感知響應能力,任何降低速度或凍結速度的方法都會嚴重降低速度並凍結GUI。事實上,絕對不應該在大多數Swing程序(在Swing事件線程上運行的所有程序)的代碼中調用Thread.sleep,但在paintComponent中這樣做是更糟糕的罪行。解決方法是使用Swing Timer,並將代碼放在Timer的ActionListener的actionPerformed代碼中,以便定期重複調用。在此方法中,更改類中字段的值(例如wspX和wspY),請調用repaint(),然後使用paintComponent中的那些字段來確定繪製在哪裏的內容。

+0

謝謝你我使用Swing Timer,它的工作原理:)現在我可以專注於mouseEvent – Miszel

+1

永遠永遠! +1 – MadProgrammer

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個。