2013-05-11 47 views
1

我想實現一個遊戲的雙緩衝,但我不知道如果我正確地做它。雙緩衝似乎不連貫

我在我的遊戲主循環,調用this.repaint()然後應該這樣做:

@Override 
public void paint(Graphics g){ 
    // this.getWidth()/this.getHeight() is the window size 
    this.dbImage = createImage(this.getWidth(), this.getHeight()); 
    this.dbg = dbImage.getGraphics(); 
    this.paintComponent(dbg); 
    g.drawImage(this.dbImage, 0, 0, this); 
} 

@Override 
public void paintComponent(Graphics g){ 
    try{ 
     g.drawImage(bg, 0, 0, this); 
     // gameObjects is an ArrayList with an object in it that represents 
     // an item on the screen, such as an enemy or a bullet 
     for(int i = 0; i < gameObjects.size(); i++){ 
      GameObject go = gameObjects.get(i); 
      g.drawImage(go.getSprite(), go.getX(), go.getY(), this); 
     } 
    }catch(Exception e){ 
    } 
} 

我基本上做了這傢伙在這裏所做的:YouTube Video我遇到的問題是,它似乎運行更糟的是,在我進行雙緩衝之前。有時項目會凍結半秒鐘,然後恢復正常,然後在幾分鐘內再次發生(或更少)。

+0

可以將垃圾收集踢入。必須有一個屬性選擇,以使其連續。 – 2013-05-11 21:46:54

+0

g.drawImage(bg,0,0,this);應該在go.getsprite上完成擺脫雙重繪圖。你必須在沒有看到的背景圖像上進行。 – 2013-05-11 21:49:03

+0

在精靈上繪製多個圖形,但在精靈屏幕上繪製單個圖形。 go.getSprite()。drawImage(a,x,y,this)是否工作? – 2013-05-11 21:50:22

回答

0

創建一個圖像,爲該圖像創建一個緩衝區,然後在緩衝區上進行所有繪製,以便它不會被繪製到每個繪圖操作的畫面。當全部完成整個畫面時,您現在可以在屏幕上真實地繪製該圖像。

在INIT:

offscreen = createImage(dim.width,dim.height); 
bufferGraphics = offscreen.getGraphics(); 

在繪圖(無論你想在緩衝區)部分:

bufferGraphics.fillRect(20, 20+m,0,20); 

在繪製屏幕時,全部完成:

g.drawImage(offscreen,0,0,this); 

如果這些犯規滿足,也有三重緩衝。