原理--内存绘图
首先理解内存绘图,即把要绘制的东西先在内存中画好,然后一次性的画到屏幕上来。内存绘图经常用来防止闪烁。因为闪烁的原因是因为反差太大。例如你的绘图过程是先用白色擦除整个窗口,然后再将黑色的文字画到屏幕上来,这样在窗口重绘的时候,原本黑色文字区域就会白光一闪,然后再出现文字,也就是我们说的闪烁了。而内存绘图的过程呢,是先创建一个内存DC,然后在这个DC上把要绘制的图形画好,之后一次性的填到屏幕上去。
双缓冲
双缓冲的原理可以这样形象的理解:把电脑屏幕看作一块黑板。首先我们在内存环境中建立一个“虚拟“的黑板,然后在这块黑板上绘制复杂的图形,等图形全部绘制完毕的时候,再一次性的把内存中绘制好的图形“拷贝”到另一块黑板(屏幕)上。采取这种方法可以提高绘图速度,极大的改善绘图效果。下面是原理图:
实现
在类中新建一个Image类型的对象(offScreenImage),作为缓冲
//双缓冲罐防闪屏
Image offScreenImage = null;
当全部绘图操作完成后,再将该图片传给屏幕
public void paint(Graphics g)
{
//第一次绘制时新建缓冲图片
if(offScreenImage == null)
{
offScreenImage = createImage(GameUtils.WIDTH,GameUtils.HEIGHT);
}
//获取缓冲图片的画笔对象
Graphics gImage = offScreenImage.getGraphics();
gImage.fillRect(0,0,GameUtils.WIDTH,GameUtils.HEIGHT);
//游戏尚未开始
if(state == 0)
{
//在里面全画在缓冲图片上
gImage.drawImage(GameUtils.bgImg,0,0,null);
gImage.drawImage(GameUtils.bossImg,220,120,null);
gImage.drawImage(GameUtils.explodImg,270,350,null);
GameUtils.draw(gImage,"点击开始游戏",Color.yellow,40,180,300);
}
//将该缓冲图片一次性加载到屏幕上
g.drawImage(offScreenImage,0,0,null);
}