这是很久以前做的一个关于线程学习的东东,,,点击发射,发射小球,可以鼠标点击删除,可以暂停,,会碰撞。。先上图。。
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 源码已经上传 欢迎参考