这是很久以前做的一个关于线程学习的东东,,,点击发射,发射小球,可以鼠标点击删除,可以暂停,,会碰撞。。先上图。。
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 源码已经上传 欢迎参考
相关推荐
Java猜数字游戏是一种常见的编程练习,它用于教授和实践多线程的概念。在这个游戏中,一个线程生成一个随机数,而另一个线程则尝试猜测这个数。这个游戏可以帮助开发者理解线程间的通信、同步以及线程安全问题。 1....
1. **线程基础**:在Java中,线程是程序执行的基本单元。每个线程代表程序中的一个独立的执行路径。Java提供了两种创建线程的方式:继承`Thread`类或实现`Runnable`接口。在这个赛马游戏中,可能每个马就是一个线程...
在Java编程中实现贪吃蛇游戏时,多线程技术的应用可以使游戏更加流畅且具有实时性。以下是对这个多线程Java程序的一些详细解释。 1. **线程基础** - 在Java中,线程是程序执行的最小单位,可以同时执行多个任务。...
Java自定义线程模型在软件开发中扮演着重要的角色,特别是在高性能、高并发的应用场景,如游戏服务器。本文将深入探讨如何在Java中构建自定义线程模型,并分享一些实践经验。 首先,我们要明白为什么要自定义线程...
在本项目“坦克游戏,基于Java基础线程实现的坦克游戏简易版”中,我们可以深入探讨以下几个关键的Java编程和游戏开发的知识点: 1. **Java线程**:线程是程序执行的最小单位,Java提供了多线程支持。在这个坦克...
Java Swing 是Java编程语言中的一个图形用户...这个实例对于学习Java GUI编程和多线程控制提供了很好的实践平台,开发者可以在此基础上进一步扩展,比如增加赛马的速度差异、障碍物等元素,提升游戏的复杂度和趣味性。
飞机大战+学习Java者”揭示了这个压缩包包含的内容是关于Java编程的,特别是涉及到多线程和图形用户界面(GUI)开发,使用了Java的Swing和AWT库来实现一个“飞机大战”的游戏。这是一个适合初学者的项目,旨在帮助...
在Java编程领域,线程游戏是一种有趣的实践方式,用于学习和理解多线程概念。"打地鼠"这个游戏,作为一个编程实例,可以帮助新手程序员更好地掌握Java中的并发编程基础。在这个游戏中,程序会模拟地鼠随机出现和消失...
1. **Java基础** Java是面向对象的编程语言,其强大的类库支持使得开发各种类型的应用程序变得简单。在这个贪吃蛇游戏中,我们看到了对Java Swing库的运用,它提供了构建图形用户界面(GUI)所需的组件,如JFrame、...
《Java飞机大战小游戏:网络数据库线程...通过这个项目,开发者可以深入理解Java的面向对象编程、事件驱动、JDBC、Socket编程以及多线程等核心概念,同时也能感受到编程的乐趣和挑战,为今后的软件开发奠定坚实基础。
多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨Java多线程的基础概念、基本原理及其在实践中的应用。 #### 二、核心概念 - **进程**: 是操作系统中的一个独立执行单元...
总的来说,多线程游戏坦克大战涉及到多线程编程、游戏逻辑设计、工具使用等多个方面的知识点,这些都需要开发者具备扎实的技术基础和丰富的实践经验。通过理解并掌握这些内容,我们可以更好地理解和开发类似的游戏...
在Java编程领域,多线程和界面编程是两个重要的概念,它们经常被结合使用以创建交互式的应用程序。在这个“java+多线程+...通过学习和分析源码,开发者不仅可以提升Java编程技能,还能了解到游戏开发的一些基础原理。
总的来说,这个资源包提供了一个全面的学习路径,涵盖了Java多线程编程、GUI开发和事件处理等关键技能,并通过坦克大战这个游戏实例,让学习者有机会将理论知识付诸实践。对于想要提升Java编程能力,尤其是对游戏...
《Java基础:构建飞机大战小游戏解析》 在编程领域,Java是一种广泛应用的编程语言,尤其在初学者中颇受欢迎。本篇文章将详细解析一个使用Java基础编写的“飞机大战”小游戏,旨在帮助初学者理解Java的基本语法和...
总的来说,开发Java雷电游戏不仅需要扎实的Java基础知识,还需要灵活运用GUI编程、事件处理、多线程以及算法设计等技能。通过实际开发这样的项目,学习者可以将理论知识转化为实践能力,加深对Java编程的理解,并且...
"java基础练习之石头迷阵小游戏的源码"是一个针对初学者和有一定经验的开发者设计的项目,旨在帮助他们深入理解和运用Java语言的核心概念。这个项目主要涉及到以下几个重要的Java知识点: 1. **面向对象编程**:...
在Java多线程游戏中,需要注意过度创建线程可能导致系统资源的浪费。开发者可能使用线程池(`ExecutorService`)来复用线程,减少创建和销毁线程的开销,提高效率。 9. **内存管理**: 多线程可能导致内存共享...
1. **Java多线程基础** - Java提供了内置的多线程支持,可以通过继承`Thread`类或实现`Runnable`接口创建线程。 - `start()`方法用于启动线程,`run()`方法包含线程的主要执行逻辑。 - 线程间通信:`wait()`, `...