2013-08-16 34 views
2

我已經搜索過並遇到過不同類型的遊戲循環。我一直使用java中不同類型的遊戲循環

Screen.java擴展了JFrame,同時也添加了所有通常位於兩個不同的.java一個用於鍵盤的偵聽器,一個用於鼠標。

public void Draw(Graphics g){ 
    Graphics2D g2 = (Graphics2D)g; 
    //Everything that I render at the screen goes here, or I pass along g2 to them so they can be rendered. Such as level.draw(g2); 
    repaint(); 
} 

@Override 
public void paint(Graphics g){ 
    Image offScreenBuffer = createImage(getWidth(), getHeight()); 
    Draw(offScreenBuffer.getGraphics()); 
    g.drawImage(offScreenBuffer, 0, 0, null); 
} 

然後在主我有睡眠

@Override 
public void run(){ 
    while(true){ 
     //all update code goes here. 
     try{ Thread.sleep(1); }catch(Exception e){} 
    } 
} 

正常Runnable的循環,但我看到有人用定時器,信號量,和TimerTask來創建一個運行循環,採取的護理建議輸入,更新,最後重新排序。所以我覺得哪種方法最好?因爲它接縫,如果我使用TimerTask的創建循環,渲染遊戲它接縫,我需要鎖定它到一個特定的FPS。

對於我所看到和理解的,我可以使用Timer和TimerTask來安排遊戲更新。但是,我不知道如何改變我的代碼,或者我在這裏錯過了什麼?

+1

我已經投票決定關閉這個問題,因爲它會吸引自以爲是的回答和辯論。大多數「*什麼是最好的X *?」問題不適合Stack Overflow。 –

+0

儘管你的'paint'方法令人擔憂,除了確保你更新屏幕與EDT正確同步之外,我會說你的'Runnable'方法可能是最明智的,只要你正確地考慮到嘗試保持幀速率一致... – MadProgrammer

+0

以及我現在有更新的塗料方法,然後我可以。我不能說我的更新方法,因爲我使用Thread.sleep() – Yemto

回答

-1

對於遊戲,我建議你只在計算FPS時。這是所有關於FPS:

private void run() 
{ 
    long now = System.currentTimeMillis(); 
    long last = 0; 
    int fps = 60; 
    while(true) 
    { 
     if(now-last >= 1000/fps) 
     { 
      //do your stuff 

      update(); 
      render(); 
      System.out.println("test"); 
      last = now; 
     } 
     now = System.currentTimeMillis(); 

    } 
} 

您可以在這裏添加一些東西等代替while(true)你可以使用一個布爾停止和啓動遊戲,也許如果您使用不同Gamestates。你也可以在這個循環內更新並儘可能地進行渲染。您也可以創建update(float elapsed)而不是update()方法,以便您可以更新位置和其他內容一致。

而且看這個問題:https://gamedev.stackexchange.com/questions/59181/proper-method-to-update-and-draw-from-game-loop

+0

這是關於穩定性,然後fps,但是,接縫鎖定fps爲60.如果我使用方法我現在有fps的變化取決於計算機可以處理什麼。這只是我需要得到一個很好的更新()循環 – Yemto

+0

你不必鎖定fps;)我只是這樣做。看看我編輯過的鏈接。 – Loki

+0

它仍然被鎖定...或者至少受到限制,當使用我目前的方法時,只要電腦可以處理它們,幀就會更新 – Yemto