用线程回让图动起来
用线程来让图动起来
//两张图循环, 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次的速度画在面板上,这样动态图看起来就流畅多了,代码如上
还可以写一个画背景图的线程,在这个线程里面用一张首尾像似的图画两张循坏,让背景移动起来,在加一个走动的人,一幅动画图就粗来了,高大上的赶脚,哈哈