2013-08-19 66 views
1

我會知道如果我的實現對於雙緩存圖像是正確的..因爲我注意到抖動我的圖像的邊界,我在屏幕中移動...這是正常的?Jpanel中的雙緩存圖像示例

public void paintComponent(Graphics g) { 
    Image bufferimage= createImage(180,180); 
    Graphics dbg= bufferimage.getGraphics(); 

    //clean the screen 
    dbg.setColor(new Color(100,100,100)); 
    dbg.fillRect(0,0,getWidth(),getHeight()); 

    if (game_is_running) { 
     // draw various type of object with drawImage 
     for(int i=0; list[i]!=null; i++) { 
      list[i].draw(dbg); 
     } 
     target.draw(dbg); 
     I.draw(dbg); 
    } 

    //finally draw the image linked to graphics 
    g.drawImage(bufferimage,0,0,this); 
} 

回答

3

移動bufferimage的創建出paintComponent()方法。每次調用該方法時都不需要創建它。無論如何,你正在繪製整個表面。

當你從bufferImage(在你的情況下,即dbg變量)檢索到的Graphics做你應該調用它dispose()

最後,如果確保您的組件和包含它的組件具有屬性doubleBufferred設置爲true,那麼您可能在沒有第二張圖像的情況下離開。

+0

您的最後一段可能是最重要的一段。大多數Swing組件默認都是雙緩衝。 – haraldK

3

所有paintComponent()方法都應該繪製圖像。

「如果遊戲正在運行」代碼不屬於paintComponent()方法。這個想法是有一個計時器或更改您的遊戲狀態,並在您的圖像上進行自定義繪圖。然後,當Swing調用paintComponent()方法時,您可以簡單地在當前狀態下繪製圖像。請參考Custom Painting ApproachesDrawOnImage示例。該代碼通過使用鼠標將矩形添加到圖像。然後,每當組件重新繪製時,圖像就被繪製。

想法是創建/修改圖像一次,然後重新繪製圖像。在遊戲中,可能會發現每次修改圖像時都會繪製它,但代碼不應該是paintComponent()方法的一部分。