`
师大黄飞
  • 浏览: 45241 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

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

  • 大小: 554.6 KB
0
4
分享到:
评论

相关推荐

    java 猜数字游戏,学习线程

    Java猜数字游戏是一种常见的编程练习,它用于教授和实践多线程的概念。在这个游戏中,一个线程生成一个随机数,而另一个线程则尝试猜测这个数。这个游戏可以帮助开发者理解线程间的通信、同步以及线程安全问题。 1....

    Java多线程赛马游戏.zip

    1. **线程基础**:在Java中,线程是程序执行的基本单元。每个线程代表程序中的一个独立的执行路径。Java提供了两种创建线程的方式:继承`Thread`类或实现`Runnable`接口。在这个赛马游戏中,可能每个马就是一个线程...

    贪吃蛇的多线程java程序

    在Java编程中实现贪吃蛇游戏时,多线程技术的应用可以使游戏更加流畅且具有实时性。以下是对这个多线程Java程序的一些详细解释。 1. **线程基础** - 在Java中,线程是程序执行的最小单位,可以同时执行多个任务。...

    java自定义线程模型处理方法分享

    Java自定义线程模型在软件开发中扮演着重要的角色,特别是在高性能、高并发的应用场景,如游戏服务器。本文将深入探讨如何在Java中构建自定义线程模型,并分享一些实践经验。 首先,我们要明白为什么要自定义线程...

    坦克游戏,基于java基础线程实现的坦克游戏简易版

    在本项目“坦克游戏,基于Java基础线程实现的坦克游戏简易版”中,我们可以深入探讨以下几个关键的Java编程和游戏开发的知识点: 1. **Java线程**:线程是程序执行的最小单位,Java提供了多线程支持。在这个坦克...

    Java Swing 赛马 小游戏 线程 实例

    Java Swing 是Java编程语言中的一个图形用户...这个实例对于学习Java GUI编程和多线程控制提供了很好的实践平台,开发者可以在此基础上进一步扩展,比如增加赛马的速度差异、障碍物等元素,提升游戏的复杂度和趣味性。

    JAVA+多线程+swing和awt技术+ 飞机大战+学习Java者

    飞机大战+学习Java者”揭示了这个压缩包包含的内容是关于Java编程的,特别是涉及到多线程和图形用户界面(GUI)开发,使用了Java的Swing和AWT库来实现一个“飞机大战”的游戏。这是一个适合初学者的项目,旨在帮助...

    java 线程游戏 打地鼠

    在Java编程领域,线程游戏是一种有趣的实践方式,用于学习和理解多线程概念。"打地鼠"这个游戏,作为一个编程实例,可以帮助新手程序员更好地掌握Java中的并发编程基础。在这个游戏中,程序会模拟地鼠随机出现和消失...

    贪吃蛇胆 java 多线程,网络

    1. **Java基础** Java是面向对象的编程语言,其强大的类库支持使得开发各种类型的应用程序变得简单。在这个贪吃蛇游戏中,我们看到了对Java Swing库的运用,它提供了构建图形用户界面(GUI)所需的组件,如JFrame、...

    java飞机大战小游戏(网络数据库线程).rar

    《Java飞机大战小游戏:网络数据库线程...通过这个项目,开发者可以深入理解Java的面向对象编程、事件驱动、JDBC、Socket编程以及多线程等核心概念,同时也能感受到编程的乐趣和挑战,为今后的软件开发奠定坚实基础。

    java多线程学习资料

    多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨Java多线程的基础概念、基本原理及其在实践中的应用。 #### 二、核心概念 - **进程**: 是操作系统中的一个独立执行单元...

    多线程游戏坦克大战

    总的来说,多线程游戏坦克大战涉及到多线程编程、游戏逻辑设计、工具使用等多个方面的知识点,这些都需要开发者具备扎实的技术基础和丰富的实践经验。通过理解并掌握这些内容,我们可以更好地理解和开发类似的游戏...

    java+多线程+界面编程+事件监听+坦克大战Java源码.

    在Java编程领域,多线程和界面编程是两个重要的概念,它们经常被结合使用以创建交互式的应用程序。在这个“java+多线程+...通过学习和分析源码,开发者不仅可以提升Java编程技能,还能了解到游戏开发的一些基础原理。

    java+多线程+界面编程+事件监听+坦克大战源码整理

    总的来说,这个资源包提供了一个全面的学习路径,涵盖了Java多线程编程、GUI开发和事件处理等关键技能,并通过坦克大战这个游戏实例,让学习者有机会将理论知识付诸实践。对于想要提升Java编程能力,尤其是对游戏...

    java基础代码写的飞机大战小游戏

    《Java基础:构建飞机大战小游戏解析》 在编程领域,Java是一种广泛应用的编程语言,尤其在初学者中颇受欢迎。本篇文章将详细解析一个使用Java基础编写的“飞机大战”小游戏,旨在帮助初学者理解Java的基本语法和...

    Java小游戏Java雷电游戏Java小游戏Java雷电游戏Java小游戏Java雷电游戏Java小游戏Java雷电游戏

    总的来说,开发Java雷电游戏不仅需要扎实的Java基础知识,还需要灵活运用GUI编程、事件处理、多线程以及算法设计等技能。通过实际开发这样的项目,学习者可以将理论知识转化为实践能力,加深对Java编程的理解,并且...

    java基础练习之石头迷阵小游戏的源码

    "java基础练习之石头迷阵小游戏的源码"是一个针对初学者和有一定经验的开发者设计的项目,旨在帮助他们深入理解和运用Java语言的核心概念。这个项目主要涉及到以下几个重要的Java知识点: 1. **面向对象编程**:...

    基于java多线程的一款小游戏.zip

    在Java多线程游戏中,需要注意过度创建线程可能导致系统资源的浪费。开发者可能使用线程池(`ExecutorService`)来复用线程,减少创建和销毁线程的开销,提高效率。 9. **内存管理**: 多线程可能导致内存共享...

    JAVA(坦克大战,多线程管理).rar

    1. **Java多线程基础** - Java提供了内置的多线程支持,可以通过继承`Thread`类或实现`Runnable`接口创建线程。 - `start()`方法用于启动线程,`run()`方法包含线程的主要执行逻辑。 - 线程间通信:`wait()`, `...

Global site tag (gtag.js) - Google Analytics