双缓存技术(图片一直闪烁怎么办)

在做一个游戏或者动画时,窗口需要绘制多张图片和背景,会出现闪烁现象,是因为我们用了重新绘制会一直交替的绘制背景,图片,背景,图片。

而双缓存就是,我们先绘制一个跟窗口一样大小的画布,然后将背景图片绘制在这个画布上,再把画布绘制到窗口上就可以了。

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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值