2017-06-10 108 views
4

我做了我的第一場比賽中爪哇 - 蛇, 它的主循環看起來像這樣Java的貪吃蛇遊戲,避免使用的Thread.sleep

while (true) 
    { 
     long start = System.nanoTime(); 
     model.eUpdate(); 
     if (model.hasElapsedCycle()) 
     { 
      model.updateGame(); 
     } 
     view.refresh(); 
     long delta = (System.nanoTime() - start)/1000000L; 
     if (delta < model.getFrameTime()) 
     { 
      try 
      { 
       Thread.sleep(model.getFrameTime() - delta); 
      } catch (Exception e) 
      { 
       e.printStackTrace(); 
      } 
     } 
    } 

但是,在我的項目的質量要求有一個響應點,所以我需要將線程睡眠改變成其他東西,但不知道如何以一種簡單的方式做到這一點。 在此先感謝您的任何建議。

+4

我會使用一個['Timer'](https://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html)來調用幀率。 – ChiefTwoPencils

+1

謝謝你的建議!我在我的項目中實現了Timer,它工作得非常完美,即使我昨天發現了固定的暫停錯誤:) – Azathanai

+1

考慮將其轉化爲答案@chief –

回答

3

我做了一個簡單的遊戲或兩個Java和處理主遊戲循環我用一個Swing Timer。定時器將允許您在提供的delay過後設置ActionListener。中間延遲將來自您的幀速率。最基本的用法如下所示:

Timer timer = new Timer(delay, listener); 
timer.start(); 

這會將初始延遲和中間延遲設置爲相同的值。您還可以設置他們如果需要的話,像這樣以不同的值:

Timer timer = new Timer(delay, listener); 
timer.setInitialDelay(0); 
timer.start(); 

在上面的例子中,listener將盡快開始後,在-之間的delay隨後開火。

-2

當時間流逝時執行任務,否則就是循環。

while (true) 
{ 
    long delta = (System.nanoTime() - start)/1000000L; 
    if (delta >= model.getFrameTime()) 
    { 
     long start = System.nanoTime(); 
     model.eUpdate(); 
     if (model.hasElapsedCycle()) 
     { 
      model.updateGame(); 
     } 
     view.refresh(); 
    } 
} 
+0

我認爲這將是CPU密集型,因爲它將始終運行。需要某種方式停放並開始處理某些事件。 –

+2

恭喜;你剛剛設計了一個非常昂貴的暖風機。這是一個可怕的想法。 –

-1

一個更好的主意是使用上面建議的Timer,它可以讓你在沒有調用sleep()的情況下在指定的延遲後觸發。

如果你想讓它更復雜一些,但是自制的開始一個新的線程來處理睡眠。 你可以用一些池化頻率來放置池機制以避免thread.sleep。如果條件不滿足,則在while循環中放入你的條件並等待一些時間。等待時間應該更短,因此它將以小的時間間隔進行輪詢。

//more code here It is a sample code 
    synchronized(this) { 
     while (delta < model.getFrameTime()) { 
      this.wait(500); 
     } 
     //more code 
+2

你只是無法在你調用它的對象上調用'wait'。你應該在你的答案中包括這一點。 「睡眠」不需要鎖定,但是「等待」需要它。 –

+0

添加了一個同步塊,我還沒有添加,因爲我試圖突出顯示只有等待部分 –

+0

好了,現在下一步。線程正在等待,你可以在答案中告訴它是主線程還是其他線程。如果它是主線程,並且它正在等待響應如何解決?如果它是另一個線程,那麼你在答案中提到它。 –