2012-03-27 57 views
0

最近我一直在研究java遊戲,並且我發現了很多東西。但是,有一件事仍然困擾着我。它的設置方式,玩家穿過背景(遊戲板)。目前,每次玩家移動時,都會重新繪製整個框架,包括背景。當玩家移動時,這會導致簡短而煩人的屏幕閃爍。Java:將多個對象繪製到一個框架上

我已經分離出來,我的代碼,以從需要重新繪製的東西分別繪製背景:

公共無效drawMap(圖形窗格){...}

公共無效drawPlayer(圖形窗格){...}

問題是,我無法找到一種方法,使我留在屏幕上時,我使用repaint(); ,這是玩家移動的必要條件。有什麼建議麼?

+0

你想要雙緩衝! – 2012-03-27 20:30:01

回答

1

你應該看看雙緩衝,基本上你將圖像繪製到緩衝區,然後繪製緩衝區。它應該消除你正在談論的閃爍效果。下面是一些有用的鏈接:

http://docs.oracle.com/javase/tutorial/extra/fullscreen/doublebuf.html
http://content.gpwiki.org/index.php/Java:Tutorials:Double_Buffering
http://www.ecst.csuchico.edu/~amk/classes/csciOOP/double-buffering.html

只是評論,如果你無法理解它。

更新:我也建議你看看'Killer game programming in java'。您可以獲得一箇舊版本的免費電子書。其中一些有點過時,但前幾章關於設置遊戲循環和繪製屏幕等方面的內容仍然非常相關。

更新2:從第二個環節,嘗試這樣的事情:

private void drawStuff() { 
    BufferStrategy bf = this.getBufferStrategy(); 
    Graphics g = null; 

    try { 
    g = bf.getDrawGraphics(); 

     drawMap(g); 
     drawPlayer(g); 

    } finally { 
    // It is best to dispose() a Graphics object when done with it. 
    g.dispose(); 
    } 

    // Shows the contents of the backbuffer on the screen. 
    bf.show(); 

     //Tell the System to do the Drawing now, otherwise it can take a few extra ms until 
     //Drawing is done which looks very jerky 
     Toolkit.getDefaultToolkit().sync(); 
} 

更新3:這個帖子here給出了一個很好的代碼示例,你可以玩和適應,應該給你最好的主意關於如何做雙緩衝

+0

我在這些網站上閱讀。我理解它背後的想法,但我不確定如何使用框架和繪畫方法來實現它。 (繪畫方法調用上面列出的兩種方法。) – Docithe 2012-03-27 20:49:11

+0

+1對於'KGPIJ'。 – 2012-03-27 20:54:56

+0

我看到一個,但它似乎沒有使用任何繪畫方法。這就是我困惑的原因。 – Docithe 2012-03-27 22:18:41

0

我建議避免重繪每一個變化的一切。而是以固定間隔繪製整個幀,例如,每50ms。只要保持一個類中每個元素的狀態,並且只要改變了某個數據值即可。由於固定的重繪時間間隔,顯示屏將在下一次重繪時收集任何更改。