2011-01-22 62 views
0

你好我正在寫一個小遊戲,它幾乎完成,唯一不起作用的是ImageBuffer。每10毫秒我稱之爲repaint()方法。我的paint()方法如下:BufferedImage閃爍的問題

private Graphics2D g2D; 

public void paint (Graphics g) { 
    BufferedImage bimage = ((Graphics2D)g).getDeviceConfiguration().createCompatibleImage(700, 600, Transparency.OPAQUE); 
    g2D = bimage.createGraphics(); 
    g2D.setFont(font);   
    for(Wall wall: walls){ 
     wall.paint(g2D); 
    } 
    g2D.setColor(Color.orange); 
    paddle.paint(g2D); 
    g2D.drawString(score + "", 150,50); 
    g2D.drawString("record: "+topscore , 350,50); 
    g2D.setColor(Color.red); 
    ball.paint(g2D); 
    g.drawImage(bimage,0,0,this); 
} 

但是,這似乎並沒有消除閃爍。我認爲在bufferedimage開始繪製之前屏幕已被清除。 任何人都可以幫我解決這個問題嗎? 謝謝!

回答

1

您應該擴展JComponent而不是Canvas,具體取決於您是使用Swing而不是AWT。這樣做會爲您提供一個不錯的輕量級組件,並且不需要您實施雙緩衝支持。然後,在您重寫的paintComponent(..)中使用提供的Graphics對象繪製圖像。

關於原始代碼的主題,在繪製中每次創建一個新的兼容圖像都會變得非常糟糕(這是一個非常昂貴的操作,它使用大型字節緩衝區 - 您會頻繁GC停頓)。如果你真的想在AWT中使用雙緩衝(這會在你調整大小時閃爍,但在applet中應該可以),你應該看看BufferStrategy

編輯:改變組件到JComponent的,哎呀呀:)

+0

對不起,我的意思是JComponent :) – 2011-01-23 17:27:15

1

我真的不能告訴你在做什麼從代碼貼出來,但我猜你是想畫一些背景圖片與一些移動圖像在上面。如果是這樣,那麼你的做法是錯誤的。

每次繪畫被調用時,您都不想重新創建背景圖像。相反,應該在paintComponent()方法之外創建一次緩衝圖像。然後,當您重新繪製組件時,首先只需繪製圖像(作爲背景)。然後在背景上畫槳和球。

另一種方法是隻使用JLabels來表示你的槳和球。然後移動組件,您只需更改其位置。然後只有組件的舊/新位置需要重新繪製,而不是整個背景,這也是更有效的。

2

你需要重寫update

public void update() { 
    paint(); 
} 

update默認實現填充背景色全區調用paint之前,這是什麼原因造成的閃爍。

+0

什麼是更新應該是重寫?不清楚什麼基類正在擴展。 – 2013-11-05 15:34:43