解决Java设计游戏的时候,画面不动和闪烁问题,双缓冲

 

我们在设计java图形程序的时候(注意,不是GUI程序,是用java来画图的程序,也就是说调用了public void paint(Graphics g)方法的程序。

 第一个问题, 画出来的程序不会动。通常采用的解决方法是加入新的线程内部类,通过此内部类去访问包装类的repaint()方法,从而不停地重画该界面,实现我们能看到的动的效果。

    privateclass PaintThread implements Runnable {

 

       publicvoid run() {

           while(true) {

              repaint();

              try {

                  Thread.sleep(100);

              } catch (InterruptedException e) {

                  e.printStackTrace();

              }

           }

       }

      

    }

注意,这里使用的是内部类,才能调用外部包装类的repaint()方法。

 

第二个问题,闪烁现象。

 

主要是和线程的睡眠时间有关,睡眠时间越短,闪烁显现就越严重。是因为显示器的刷新频率高于程序。paint方法还没有来得及画完整幅画面,所以就出现了闪烁问题。

解决办法就是将使用双缓冲消除,先把所有东西画在虚拟屏幕上,前面什么都不画,然后一次性把画好的内容显示出来。

在java的图形当中,repaint()首先调用update(),然后update()会调用paint()。

因为paint()是不可以改的,repaint()是用来调用的。我们只能在update()上做文章。

 

第一步:需要用到一张虚拟的图片

    ImageoffScreenImage = null; //虚拟图片

 

第二步,重写update()方法。(注,update是container的方法。)

    publicvoid update(Graphics g) {

       if(offScreenImage == null) {

           offScreenImage = this.createImage(800, 600);

       }

       Graphics gOffScreen = offScreenImage.getGraphics();

       Color c = gOffScreen.getColor();

       gOffScreen.setColor(Color.GREEN);

       gOffScreen.fillRect(0, 0, 800, 600);

       gOffScreen.setColor(c);

       paint(gOffScreen);

       g.drawImage(offScreenImage, 0, 0, null);

    }


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值