这是很久以前做的一个关于线程学习的东东,,,点击发射,发射小球,可以鼠标点击删除,可以暂停,,会碰撞。。先上图。。
1,还是先从从界面开始,
package hf2013718Colorball; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.util.LinkedList; import javax.swing.ImageIcon; import javax.swing.JButton; public class Cb { Jf jf; public Graphics g; public LinkedList<Ball> l=new LinkedList<Ball>(); public void UI(){ jf=new Jf(); jf.setTitle("多彩小球"); jf.setLocation(300,100); jf.setSize(600,600); jf.setResizable(true); jf.setDefaultCloseOperation(3); jf.setLayout(new FlowLayout()); JButton jb=new JButton("发射"); JButton jb1=new JButton("暂停"); JButton jb2=new JButton("开始"); JButton jb3=new JButton("删除"); jf.add(jb3); jf.add(jb); jf.add(jb1); jf.add(jb2); jf.addMouseListener(new Dj(this)); jf.setVisible(true); g=jf.getGraphics();
上面这些跟前面几篇博客差不多,不解释是了,这里只是实现一个简单的界面,如果你觉得几面太烂,后面我会讲深入一点,其中的public LinkedList<Ball> l=new LinkedList<Ball>();是用来存储小球的,并且后进行管理
然后给组件添加监听
Ac c=new Ac(jf,this); Be b=new Be(new Ball(),this,1); Be b1=new Be(new Ball(),this,2); De d=new De(new Ball(),this); jb.addActionListener(c); jb1.addActionListener(b); jb2.addActionListener(b1); jb3.addActionListener(d);
首先看AC
package hf2013718Colorball; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JFrame; public class Ac implements ActionListener{ public Cb c; public Graphics g; public JFrame jf; public Ac(JFrame jf,Cb c){ this.c=c; this.jf=jf; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub g=jf.getGraphics(); Ball b=new Ball(g,jf,c);//实例化一个小球线程 c.l.add(b);//添加到队列中 b.start();//启动线程 } }
这是一个按钮类,看下里面出现的Ball
package hf2013718Colorball; import java.awt.Color; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import java.util.Random; import javax.swing.JFrame; public class Ball extends Thread{ public Cb e; public int R,G,B; public int o; public Ball(Jf jf,Graphics g,int o){ this.o=o; this.jf=jf; this.g=g; } public int i=0; public Boolean d=false; public Boolean k=true; public Color c; public Graphics g,g1; public JFrame jf; public int b; public int x,y; public int xs,ys; public int xd,yd; private final int up=1; private final int down=-1; private final int right=2; private final int left=-2; public Ball(){} public Ball(Graphics g,JFrame jf,Cb c){ this.g=g; this.jf=jf; this.e=c; } public void Init(){//初始小球的颜色,坐标 Random r=new Random();//随机数 x=0;y=0; xs=1+r.nextInt(10);ys=1+r.nextInt(10); xd=2; yd=-1; b=20+r.nextInt(20); R=r.nextInt(255/(b-5));B=r.nextInt(255/(b-5));G=r.nextInt(255/(b-5)); c= new Color(R,B,G);//随机产生颜色 } public void Move(){//小球的移动 switch(xd){//x方向 case left:x=x-xs;break; case right:x=x+xs;break; } switch(yd){//y方向 case up:y=y-ys;break; case down:y=y+ys;break; } } public void Draw(Graphics g){//将自己绘画到窗体上 //int i=b;int j=b; for(int i=b;i>5;i--){ g.setColor(new Color(255-(R*(i-5)),255-(B*(i-5)),255-(G*(i-5))));//画上去 g.fillOval(x+b-i, y+b-i,2*i,2*i);//擦除 } } public void Rset(){//重置 g.setColor(jf.getBackground()); Image bj = Toolkit.getDefaultToolkit().getImage("QQ图片20130704195930.jpg") ; } private int getHeighth() { return 0; } public void Pz(){//小球碰撞 //int i=0; //System.out.println(">>>>>>>>>>"); for(int i=0;i<e.l.size();i++){ if(x!=e.l.get(i).x&&y!=e.l.get(i).y){ if(Math.abs(x-e.l.get(i).x)<=2*b&&Math.abs(x-e.l.get(i).x)<=2*e.l.get(i).b) { if(Math.abs(y-e.l.get(i).y)<=2*b&&Math.abs(y-e.l.get(i).y)<=2*e.l.get(i).b){ if(x*e.l.get(i).x>0){ if(x>e.l.get(i).x){ xd=-xd; e.l.get(i).xs+=1; }else{ e.l.get(i).xd=-e.l.get(i).xd; xs+=1; } } if(y*e.l.get(i).y>0){ if(y>e.l.get(i).y){ yd=-yd; e.l.get(i).ys+=1; }else{ e.l.get(i).yd=-e.l.get(i).yd; ys+=1; } } if(x*e.l.get(i).x<0){ xd=-this.xd; } if(y*e.l.get(i).y<0){ e.l.get(i).yd=-e.l.get(i).yd; System.out.println("2");} if(this.k==false&&e.l.get(i).k==false){ } else{ if(this.k==false){ k=true; this.xd=e.l.get(i).xd; this.yd=e.l.get(i).yd; }else if(e.l.get(i).k==false){ e.l.get(i).k=true; e.l.get(i).xd=xd;e.l.get(i).yd=yd; }} } }} } } public void Change(){//碰到墙后改变方向 if(x+b>=600){ xd=left; //System.out.println("left"+xd); }if(x<=0){ xd=right;//System.out.println("right"+xd); } if(y+b>=600){ yd=up;//System.out.println("up"+yd); } if(y<=0){ yd=down;//System.out.println("down"+yd); } } public void St(){//暂停 k=false; } public void St(int x){//开始 k=true; } public void setDe(){//删除 d=true; }; public void ch(){ while(true){ try{ Thread.sleep(62); }catch(Exception e){ e.printStackTrace(); } //jf.paint(g); } } public void Ba(){ Init(); while(true){ // Draw(); //Change(); try{ Thread.sleep(60); }catch(Exception e){ e.printStackTrace(); } Change(); if(k){ Rset();Move();}; Pz(); if(d){ Rset(); return; } } } public void run(){ if(o==1){ ch();}else{ Ba();} } }
这是小球的类,里面包括对小球的各种操作,初始,移动,碰撞,暂停
所以AC监听类的里面方法就是实例化一个小球
然后再看Be
public class Be implements ActionListener{ public Ball b; public int n; public Cb c; public int count=1; public Be(Ball b,Cb c,int n){ this.b=b; this.c=c; this.n=n; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub if(n==1){ for(int i=0;i<c.l.size();i++){ c.l.get(i).St(); } }else{ for(int i=0;i<c.l.size();i++){ c.l.get(i).St(1); } } } }
取出每一个加入刚开始提到的存储ball对象的public LinkedList<Ball> l=new LinkedList<Ball>();队列里面的小球,进行操作,这里是调用st()方法控制暂停或者开始。
然后再看De
package hf2013718Colorball; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; public class De implements ActionListener { public Ball b; public Cb c; public int i; public De(Ball b,Cb c){ this.c=c; this.b=b; } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub i=new Random().nextInt(c.l.size()); c.l.get(i).setDe();//删除 c.l.remove(i); } }
跟上面类似,这里是删除,所以c.l.remove(i);将其对象从队列中删除
之后就是将小球显示在窗体上
//实例化一个线程 Thread t1 = new Thread(new Runnable() { public void run() { int k=0, j=0; //背景图 ImageIcon img=new ImageIcon("QQ图片20130704195930.jpg"); while(true){ try { Thread.sleep(50);//延时0.5毫秒 //创建一个缓冲画纸 BufferedImage bufImage = new BufferedImage(jf.getWidth(),jf.getHeight(),BufferedImage.TYPE_INT_RGB); Graphics g = bufImage.getGraphics();//得到画纸上的画布 g.drawImage(img.getImage(), j,k,null);//现将背景画在画纸上 //然后将每一个小球画在画纸上 for(int i=0; i<l.size();i++){ Ball ball = l.get(i); ball.Draw(g); } //然后再将画纸画到面板上 jf.getGraphics().drawImage(bufImage, 0, 0, null); } catch (InterruptedException e) { e.printStackTrace(); } } } } );
这里用一个线程去显示小球,并用到缓冲画纸。
从上我们了解到怎么实现一个线程
继承Thread类重写run()方法,然后调用start()方法启动线程
或者继承Runnable,
然后Thread t=New Thread(你的线程类对象)
t.start()调用
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
了解上面的例子之后你就可以做游戏了
你可以把小球换成,飞机,然后有碰撞,子弹,碰到后消失,。。鼠标点击,击落等等。。。有不懂可以留言或者联系我 50586022 源码已经上传 欢迎参考