用线程回让图动起来

用线程来让图动起来
//两张图循环,
	public void draw(Graphics g){
		g.drawImage(i.getImage(), x, y, i.getImage().getWidth(null),
				i.getImage().getHeight(null), null);
		g.drawImage(i.getImage(), x+ i.getImage().getWidth(null), y, i.getImage().getWidth(null),
				i.getImage().getHeight(null), null);
	}
	public void move(){
			x-=5;
			if(x<- i.getImage().getWidth(null))x=0;
	}

 

	this.setVisible(true);
		//在主线程中统一画图
		while(true){
			g=drawjp.getGraphics();
			bufferedImage=new BufferedImage(drawjp.getWidth(),drawjp.getHeight(),
					BufferedImage.TYPE_INT_RGB);
			Graphics ggg=(Graphics2D)bufferedImage.getGraphics();//得到图片缓存的画布
			ggg.setColor(Color.WHITE);//将图片缓存的背景设为白色
			ggg.fillRect(0, 0,bufferedImage.getWidth(), bufferedImage.getHeight());
			
			try {
				Thread.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			for(int i=0;i<list.size();i++){
				Ball ball=list.get(i);
				ball.drawBall(ggg);
			}
			g.drawImage(bufferedImage, 0,0 ,drawjp.getWidth(),drawjp.getHeight(), null);
		}

 

//run方法类实现小球的移动
	public void run(){
		while (true){
			if(endflag)break;//结束线程
			try {
				Thread.sleep(30);
			} catch (Exception e2) {
				e2.printStackTrace();
			}
			if(stopflag)continue;
			move();
		}
	}

 

线程就像火影里面的忍者使用隐分身一样,它可以让计算机分身,做不同的事情,这些事可以跟主线程同时运行,所以用它来让我们画的东西动起来再合适不过了,这是一件神奇的事情 :D

 

首先我们创建一个画球的线程,在run方法里面写一个死循环,然后里面执行球移动(实际上就是改变球的坐标啦)的方法,画球的方法并不在这个线程里执行,而是在主线程里画,将启动的画球线程用队列存起来,然后在主线程里遍历所有线程的画球的方法,统一画在主线程里的缓存图上,然后这些图一每秒100次的速度画在面板上,这样动态图看起来就流畅多了,代码如上

 

还可以写一个画背景图的线程,在这个线程里面用一张首尾像似的图画两张循坏,让背景移动起来,在加一个走动的人,一幅动画图就粗来了,高大上的赶脚,哈哈