在做一个游戏或者动画时,窗口需要绘制多张图片和背景,会出现闪烁现象,是因为我们用了重新绘制会一直交替的绘制背景,图片,背景,图片。
而双缓存就是,我们先绘制一个跟窗口一样大小的画布,然后将背景图片绘制在这个画布上,再把画布绘制到窗口上就可以了。
Image offScreenImage; //建一个画布
offScreenImage=this.createImage(768,1000); //设置画布大小跟窗口一样,相对于获得一个图片copy
Graphics gImage=offScreenImage.getGraphics(); //只要用到这个画笔就是向画布上加东西
举个例子:出现闪烁的绘制图片:
public class Bg {
//将图标载入,设置为背景
Image bg=Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
Image bg1=Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg");
Image peo=Toolkit.getDefaultToolkit().getImage("imgs/peo.png");
//绘制方法
void paintSelf(Graphics g){
g.drawImage(bg1,0,0,null); //绘制图片
g.drawImage(bg,0,200,null); //绘制图片
g.drawImage(peo,310,50,null); //绘制图片
}
}
public class GameWin extends JFrame {
Bg bg=new Bg();
//用来初始化窗口信息
void launch(){
this.setVisible(true); //设置窗口是否可见
this.setSize(768,1000); //设置窗口大小
this.setLocationRelativeTo(null); //设置窗口位置,让窗口居中
this.setTitle("标题"); //设置窗口标题
setDefaultCloseOperation(EXIT_ON_CLOSE); //关闭窗口的方法,点击右上角x关闭程序
while (true) { //让窗口一直重新绘制
repaint(); //重新绘制的方法
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//绘制方法
@Override
public void paint(Graphics g) {
bg.paintSelf(g);
}
public static void main(String[] args) {
GameWin gameWin = new GameWin();
gameWin.launch();
}
}
双缓存技术改进后,不再闪烁的代码:
public class Bg {
//将图标载入,设置为背景
Image bg=Toolkit.getDefaultToolkit().getImage("imgs/bg.jpg");
Image bg1=Toolkit.getDefaultToolkit().getImage("imgs/bg1.jpg");
Image peo=Toolkit.getDefaultToolkit().getImage("imgs/peo.png");
//绘制方法
void paintSelf(Graphics g){
g.drawImage(bg1,0,0,null); //绘制图片
g.drawImage(bg,0,200,null); //绘制图片
g.drawImage(peo,310,50,null); //绘制图片
}
}
public class GameWin extends JFrame {
Bg bg=new Bg();
Image offScreenImage;
//用来初始化窗口信息
void launch(){
this.setVisible(true); //设置窗口是否可见
this.setSize(768,1000); //设置窗口大小
this.setLocationRelativeTo(null); //设置窗口位置,让窗口居中
this.setTitle("黄金矿工"); //设置窗口标题
setDefaultCloseOperation(EXIT_ON_CLOSE); //关闭窗口的方法,点击右上角x关闭程序
while (true) {
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//绘制方法
@Override
public void paint(Graphics g) {
offScreenImage=this.createImage(768,1000); //获得一个图片copy
Graphics gImage=offScreenImage.getGraphics(); //只要用到这个画笔就是向画布上加东西
bg.paintSelf(gImage);
g.drawImage(offScreenImage,0,0,null);
}
public static void main(String[] args) {
GameWin gameWin = new GameWin();
gameWin.launch();
}
}