zoukankan      html  css  js  c++  java
  • 双缓冲绘图模式

    reapaint()调用update()再调用paint();

    所以在update中使用双缓冲

    private Image offScreenImage = null;
        public void update(Graphics g) {
            if(offScreenImage == null)
                offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
            
            Graphics gOff = offScreenImage.getGraphics();
    
            paint(gOff);       
            g.drawImage(offScreenImage, 0, 0, null);
        }

    //子类调用父类的launchFrame->PaintThread().strat()->repaint()->update(Graphics g)->paint(Graphic iB)===>g:原画布,iB:新画布
    //update中有paint()方法,因为在子类中对该函数进行了覆盖,所以不调用父类中的paint(),而是子类中的paint(),而此时传给paint的参数是新的画布,

    //而不是在原画布上直接操作,然后再把这个画布放到原来的画布上。这就形成了双缓冲绘图。

    完整程序:

    public class MyFrame  extends Frame {
        
        /**
         * 加载窗口
         */
        public void launchFrame(){
            setSize(Constant.GAME_WIDTH, Constant.GAME_HEIGHT);
            setLocation(100, 100);
            setVisible(true);
            
            new PaintThread().start();  //启动重画线程
            
            addWindowListener(new WindowAdapter() {
                @Override
                public void windowClosing(WindowEvent e) {
                    System.exit(0);
                }
            });
        }
        
        private Image offScreenImage = null;
        public void update(Graphics g) {
            if(offScreenImage == null)
                offScreenImage = this.createImage(Constant.GAME_WIDTH,Constant.GAME_HEIGHT);
            
            Graphics gOff = offScreenImage.getGraphics();
              
            paint(gOff);
            g.drawImage(offScreenImage, 0, 0, null);  
        }
        
        /**
         * 定义一个重画窗口的线程类,是一个内部类
         * @author dell
         *
         */
        class PaintThread extends Thread {
            
            public void run(){
                while(true){
                    repaint();
                    try {
                        Thread.sleep(40); //1s = 1000ms
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }   
                }
            }
            
        }
    }
  • 相关阅读:
    新工作 Day24 周六
    新工作 Day23 周五
    新工作 Day22 周四
    新工作 Day21 周三
    新工作 Day20 周二
    新工作 Day19 周一
    新工作 Day18 周日
    新工作 Day17 周六
    java线程池 多线程搜索文件包含关键字所在的文件路径
    java实现搜索文件夹中所有文件包含的关键字的文件路径(递归搜索)
  • 原文地址:https://www.cnblogs.com/xiaochi/p/4992842.html
Copyright © 2011-2022 走看看