Java基础之线程游戏

这是很久以前做的一个关于线程学习的东东,,,点击发射,发射小球,可以鼠标点击删除,可以暂停,,会碰撞。。先上图。。

 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  源码已经上传  欢迎参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值