[英]Double buffered image example in 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);
}
将bufferimage
的创建移出paintComponent()
方法。 您无需在每次调用该方法时都创建它。 无论如何,您都在绘制整个表面。
当您完成从bufferImage
检索到的Graphics
(即您的情况下的dbg
变量)时,应该在其上调用dispose()
。
最后,如果确保您的组件和包含该组件的组件的属性doubleBufferred
设置为true
,那么您也许可以摆脱第二张图片。
paintComponent()方法应该做的就是绘制图像。
“如果游戏正在运行”代码不属于paintComponent()方法。 这个想法是要有一个Timer或可以改变游戏状态并在图像上进行自定义绘制的东西。 然后,当Swing调用paintComponent()方法时,您可以简单地以当前状态绘制图像。
看一下“自定义绘画方法”中的DrawOnImage
示例。 该代码使用鼠标将矩形添加到图像。 然后,无论何时重新绘制组件,都将绘制图像。
想法是创建/修改图像一次,然后重新绘制图像。 在游戏中,可能会发现每次修改图像时也会对其进行绘制,但是代码不应成为paintComponent()方法的一部分。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.