BIGBOSSyifi 2021-08-07 00:58 采纳率: 50%
浏览 149

Java做游戏时,JFrame中怎么使用双缓冲来解决屏幕不断闪烁的问题?

我在学习写java游戏时,遇到屏幕一只不断闪烁,更改刷新时间也没有办法,使用双缓冲来解决这个问题,我该怎样实现,试着重写update方法但结果还是不行,我这里自己重写了paint方法


public class Cuckoo extends JFrame {
    //管理所有组件
    public void init(){     //初始化组件
        /*注册组件*/
        mainWindow();
    }

    //绘制游戏窗口
    public void mainWindow(){
        /*设置窗口位置(相对于屏幕),宽高*/
        setBounds(700,250,288,512);     //x,y屏幕位置,width,height窗口大小
        setTitle("Flapp Birds");    //在窗口添加游戏名字
        /*java窗口在默认情况下隐藏的*/
        setVisible(true);   //设置窗口可见(默认是false)
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);    //关闭窗口和程序
        setResizable(false);    //禁用窗口可调尺寸
        while(true){    //让窗口自动刷新
            repaint();;
            try{
                Thread.sleep(300);   //线程休眠50ms,控制刷新频率
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }

    /*画笔*/
    public void paint(Graphics graphics){
        super.paint(graphics);  //重新绘制图片
        drawBackGround(graphics);   //加入背景图片
        moveGround(graphics);   //加入移动墙
        Bird(graphics);     //加入小鸟
    }
    /*绘制游戏背景*/
    int moveLeft = 0;   //背景向后移动

    public void drawBackGround(Graphics graphics){
        Image bg = new ImageIcon("res/bg_main.png").getImage();//加载本地图片
        graphics.drawImage(bg,moveLeft,0,null);    //设置背景参数(xy为在窗口位置)
        moveLeft -= 2;  //每次向左移动减2dp

    }

    /*移动墙*/
    public void moveGround(Graphics graphics){
        Image bgWall = new ImageIcon("res/bg_wall.png").getImage();//加载本地图片
        graphics.drawImage(bgWall,0,410,null);    //设置背景参数(xy为在窗口位置)
    }
    /*让小鸟动起来*/
    int i = 1;  //调用bird的3张图片动画

    public void Bird(Graphics graphics){

        Image bgBird = new ImageIcon("res/bulebird"+ i +".png").getImage();//加载本地图片
        graphics.drawImage(bgBird,115,260,null);    //设置背景参数(xy为在窗口位置)
        i++;
        if(i > 3){
            i = 1;
        }
    }
    //程序启动
    public static void main(String[] args) {
        new Cuckoo().init(); //启动程序
    }
}

img

  • 写回答

1条回答 默认 最新

  • 夢覚 2021-08-10 20:19
    关注

    在paint方法中创建缓冲图层(BufferImage),先把所有的图像画在缓冲层上,再把缓冲层显示(画)出来,这样就实现了双缓冲。
    尝试将你paint方法改为:

            BufferedImage image=(BufferedImage) createImage(getWidth(),getHeight());//创建与你窗口大小的image并转换为BufferedImage图层
            Graphics bi=image.getGraphics();//获得这个缓冲图层的画笔
            drawBackGround(bi);   //加入背景图片
            moveGround(bi);   //加入移动墙
            Bird(bi);     //加入小鸟
            //以上都被画在缓冲图层image上
            graphics.drawImage(image,0,0,null);//用窗口的画笔把image画出
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 8月7日

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大