我会知道我的实现对于双缓冲图像是否正确..因为我注意到我在屏幕中移动的图像边框颤抖......这是正常的吗?
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);
}
答案 0 :(得分:3)
将bufferimage
的创建移出paintComponent()
方法。每次调用该方法时都不需要创建它。无论如何,你正在绘制整个表面。
完成从Graphics
检索到的bufferImage
(例如您的dbg
变量)后,您应该在其上调用dispose()
。
最后,如果确保组件和包含它的组件将属性doubleBufferred
设置为true
,则可以在没有第二个图像的情况下离开。
答案 1 :(得分:3)
所有paintComponent()方法都应该绘制图像。
“如果游戏正在运行”代码不属于paintComponent()方法。我们的想法是让计时器或其他东西改变你的游戏状态,并在你的图像上进行自定义绘图。然后,当Swing调用paintComponent()方法时,您可以简单地将图像绘制为当前状态。
查看Custom Painting Approaches中的DrawOnImage
示例。该代码使用鼠标为图像添加矩形。然后,每当重新绘制组件时,图像都会被绘制。
想法是创建/修改图像一次,然后重新绘制图像。在游戏中,可能会发现每次修改图像时都会绘制它,但代码不应该是paintComponent()方法的一部分。