`

小球与线程

    博客分类:
  • java
 
阅读更多




     通过线程来实现动态的小球是一个比较复杂的过程,首先是能够让小球碰到壁后弹起来,这个方法的实现有一些技巧在里面,就是定义的的哥方方向变量,通过把方向赋予一定的值从而来使用switch语句或是if语句进行判断。以达到转变方向的过程。这是弹球的主要思想

首先是定义了一个面板类.

/**
 * 定义一个画画类,用来生成面板和画画。
 * @author 周建权 20130713
 *
 */

public class Draw extends JFrame {

	private JPanel jpanel;
	private Graphics g;

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Draw draw = new Draw();
		draw.initUI();
	}
	
	public void initUI(){
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setTitle("弹球");
		this.setSize(600, 600);
		this.setLayout(new BorderLayout());
		JPanel jp = new JPanel();
		jpanel = new JPanel();
		this.add(jp,BorderLayout.NORTH);
		this.add(jpanel,BorderLayout.CENTER);
		JButton jbu1=new JButton("增加");
		JButton jbu2=new JButton("继续");
		JButton jbu3=new JButton("暂停");
		JButton jbu4=new JButton ("随机删除");
		JButton jbu5=new JButton("顺序删除");
		JButton jbu6=new JButton("点鼠标删除");
		jp.add(jbu1);
		jp.add(jbu2);
		jp.add(jbu3);
		jp.add(jbu4);
		jp.add(jbu5);
		jp.add(jbu6);
		jbu4.setForeground(Color.blue);
		jbu1.setForeground(Color.blue);
		jbu2.setForeground(Color.blue);
		jbu3.setForeground(Color.blue);
		jbu5.setForeground(Color.blue);
		jbu6.setForeground(Color.blue);
		
		
		this.setVisible(true);
		
	  
	    ThreadListener l=new ThreadListener(jpanel);
	    jbu1.addActionListener(l);
	    jbu2.addActionListener(l);
	    jbu3.addActionListener(l);
	    jbu4.addActionListener(l);
	    jbu5.addActionListener(l);
	    jbu6.addActionListener(l);
	   /**
	    * 打算添加图片,还没实现此功能。
	    */
	    jpanel.setUI(new PanelUI(){
	    ImageIcon image=new ImageIcon();
	    public void paint(Graphics g,JComponent c){
	     g.drawImage(image.getImage(),0,0,null);
	    }
	     });
	   
	}
}

 接着就是实现小球主要功能的方法了。小球的各个功能都以此为基础

/**
 *   线程类
 * @author 周建权 2013.7.18
 *
 */
public class DrawThread extends Thread {
	private Graphics g;
	private JPanel jp;
	private static  ArrayList<DrawThread> ball = new ArrayList<DrawThread>();
	//定义方向
	private static final int UP=1;
	private static final int DOWN=2;
	private static final int LEFT=3;
	private static final int RIGHT=4;
	//定义小球位置
	private int x,lastx;
	private int y,lasty;
	public int getX() {
		return x;
	}
	public void setX(int x) {
		this.x = x;
	}
	public int getY() {
		return y;
	}
	public void setY(int y) {
		this.y = y;
	}
	
	// 定义半径
	private int radius;
	public int getRadius() {
		return radius;
	}
	public void setRadius(int radius) {
		this.radius = radius;
	}
	
	//定义停止暂停
	private boolean pauseFlag=false;
	private boolean stopFlag=false;
	//定义速度
	private int xspeed;
	private int yspeed;
	//球的运动方向
	private int xdirection=RIGHT;
    private int ydirection=DOWN;
	//定义颜色
	private Color co;	
	public DrawThread(JPanel jpanel){
		this.jp=jpanel;
		this.g=jpanel.getGraphics();
	}
	public static ArrayList<DrawThread> getList() {
		return ball;
	}
	
	/**
	 * run函数
	 */
	public void run(){
		init();
		while(true){
		try{
			Thread.sleep(200);
			}catch(Exception ef){}
	  if(pauseFlag==true){
		continue;
		}
		if(stopFlag==true){
		clear();
			return;
		}
		clear();
		move();
		draw();
		}
	}
	/**
	 * 定义变量的初始值
	 */
	public void init(){
		Random random=new Random();
		
		xspeed=30+random.nextInt(20);
	    yspeed=10+random.nextInt(40);
	    radius=15+random.nextInt(30);
	    co=new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256));
	}
	/**
	 * 小球移动的方法
	 */
  public void move(){
	
	    if(x<radius/2){xdirection=RIGHT;}
		else if(x>jp.getWidth()-3*radius/2){xdirection=LEFT;}
		
		if(y<radius/2){ydirection=DOWN;}
		else if(y>jp.getHeight()-3*radius/2){ydirection=UP;}
		lastx=x;
		lasty=y;

		if(this.xdirection==LEFT){
			x-=this.xspeed;
			if(collsion(LEFT)){
				xdirection=RIGHT;
			}
		}
		else if(this.xdirection==RIGHT){
			x+=this.xspeed;
			if(collsion(RIGHT)){
				xdirection=LEFT;
		}
		
		if(this.ydirection==UP){
			y-=this.yspeed;
			if(collsion(UP)){
				ydirection=DOWN;
				}
			}
		
		else if(this.ydirection==DOWN){
			y+=this.yspeed;
			if(collsion(DOWN)){
				ydirection=UP;
				}
			}
		}
		
		
  }
  	public void fillcircle(int x,int y,int radius){
  		g.fillOval(x-radius, y-radius, 2*radius, 2*radius);
  	}
	/**
	 * 绘制小球的方法
	 */
	public void draw(){
		g.setColor(co);
		fillcircle(x, y, radius);
		
		int r=co.getRed();
		int G=co.getGreen();
		int b=co.getBlue();
		int radius=this.radius;//很诡秘的代码。
		while(radius>3){
			radius-=2;
			G+=10;
			r+=10;
			b+=10;
			if(G>255){G=255;}
			if(r>255){r=255;}
			if(b>255){b=255;}
		Color d=new Color(r,G,b);
		g.setColor(d);
		fillcircle(x,y,radius);
		}
	}
	/**
	 * 擦除小球的方法
	 */
	public void clear(){
		g.setColor(this.jp.getBackground());
	    fillcircle(x, y,  2*radius);
	}
	/**
	 * 定义一个设置暂停布尔值的方法
	 * @param flag
	 */
	public void setPause(boolean flag){
		pauseFlag=flag;
	}
	/**
	 * 设置停止方法中的布尔值一直为true,线程不可重复开始,停止后直接退出
	 */
	public void setStop(boolean flag){
		this.stopFlag = flag;
	}
	/**
	 * 定义一个碰撞方法,该方法用于判断两个小球是否碰撞。
	 * @param direction
	 * @return若两球碰撞则返回true,若不碰撞则返回false
	 */
	private boolean collsion(int direction){
		for(int i=0;i<ball.size();i++){System.out.println(ball.size());
			DrawThread Thread=ball.get(i);
			if(this==Thread){
				continue;}
			int m=Math.abs(this.getX()-Thread.getX());
			int n=Math.abs(this.getY()-Thread.getY());
			int o=(int)Math.sqrt(m*m+n*n);
			if(o<=this.radius+Thread.radius);
			if(direction==LEFT||direction==RIGHT)
				Thread.xdirection=direction;
			else {Thread.ydirection=direction;
				
			}
			int xsp=this.xspeed;
			int ysp=this.yspeed;
			this.xspeed=Thread.xspeed;
			this.yspeed=Thread.yspeed;
			Thread.xspeed=xsp;
			Thread.yspeed=ysp;
			
			x=lastx;
			y=lasty;
			
			return true;
		}
		return false;
	}
	

}

下面就是添加监听器了

/**
 * 创建一个按钮监听器,按钮画小球
 * 
 * @author 周建权 2013.7.14
 * 
 */
public class ThreadListener extends Thread implements ActionListener {
	private JPanel jp;
	private Graphics g;

	public ThreadListener(JPanel jp) {
		this.jp = jp;
	}

	// 创建一个队列,用来存放线程
	ArrayList<DrawThread> allBall = new ArrayList<DrawThread>();

	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();

		if (s.equals("增加")) {
			DrawThread Thread = new DrawThread(jp);
			// allBall.add(Thread);
			Thread.start();
			allBall.add(Thread);
		}
		
		if (s.equals("继续")) {
			for (int i = 0; i < allBall.size(); i++) {
				DrawThread Thread = allBall.get(i);
				Thread.setPause(false);
			}
		}
		
		if (s.equals("暂停")) {
			for (int i = 0; i < allBall.size(); i++) {
				DrawThread Thread = allBall.get(i);
				Thread.setPause(true);
			}
		}
		
		if (s.equals("随机删除")) {
			int m = allBall.size();
			System.out.println(allBall.size());
			Random random = new Random();
			int n = random.nextInt(m);
			System.out.println(n);
			DrawThread Thread = allBall.remove(n);
			Thread.setStop(true);
			System.out.println(n);
		}
		
		if (s.equals("顺序删除")) {
			if (!allBall.isEmpty()) {
				DrawThread Thread = allBall.remove(0);
				Thread.setStop(true);
			}
		}
		
		if(s.equals("点鼠标删除")){System.out.println("怎么不可以删除");
		MouseListener mouse=new MouseListener(){
		 	
		 	public void mouseClicked(MouseEvent e){
	 	    System.out.println(allBall.size());
	 	    	for(int i=0;i<allBall.size();i++){
	 	    	DrawThread Thread=allBall.get(i);
	 	    	int x=Math.abs(Thread.getX()-e.getX());
	 	    	int y=Math.abs(Thread.getY()-e.getY());
	 	    	if(x<Thread.getRadius()&&y<Thread.getRadius()){
	 	    		allBall.remove(i);
	 	    		Thread.setStop(true);
	 	    		Thread.clear();
	 	    		}
	 	    	}
	 	    }
	 	    public void mousePressed(MouseEvent e){}
	 	    public void mouseReleased(MouseEvent e){}
	 	    public void mouseEntered(MouseEvent e){}
	 	    public void mouseExited(MouseEvent e){}
	 	};jp.addMouseListener(mouse);
	}
	
	}    
}

 一个弹球就做好了。还有待改进的是两个小球之间的效果,这个弹出来的效果一点也不好。。。  

 



 

 

 

 

  • 大小: 34.7 KB
  • 大小: 26.5 KB
  • 大小: 23 KB
  • 大小: 18.9 KB
分享到:
评论

相关推荐

    Java编写小球线程动画

    本主题聚焦于“Java编写的小球线程动画”,这涉及到Java多线程编程和图形用户界面(GUI)的设计。Java作为一种面向对象的编程语言,提供了强大的支持来创建这种动态效果。 首先,我们要理解什么是线程。线程是程序...

    移动小球/多线程控制

    在计算机科学领域,尤其是操作系统和并发编程中,"移动小球/多线程控制"是一个经典的教学示例,用于演示和理解多线程的概念。在这个实验中,我们看到一个简单的应用,它创建了三个小球并让它们按照特定的轨迹进行...

    多线程 小球 运行程序(eclipse工程可导入)

    标题中的“多线程 小球 运行程序(eclipse工程可导入)”表明这是一个与多线程编程相关的项目,可能是用Java语言实现的,因为Eclipse是Java开发的常用集成开发环境。这个程序可能设计了一个模拟小球运动的场景,通过多...

    java多线程控制小球程序

    4. **绘图与同步**:为了让用户看到小球的运动,我们需要在GUI(图形用户界面)上绘制小球。Java提供了许多库来创建GUI,如Swing或JavaFX。需要注意的是,由于线程安全问题,对GUI组件的操作通常需要在事件调度线程...

    小球线程动画 .java

    java 线程 动画

    多线程之小球碰撞

    在这个场景中,每个小球可以代表一个独立运行的线程,它们在虚拟空间中移动并可能发生碰撞,这需要线程之间的协调与同步。 首先,我们要理解什么是多线程。在单线程环境中,程序执行是顺序的,而在多线程环境中,多...

    JAVA多线程实验,字符移动、小球碰撞

    本实验通过“字符移动”和“小球碰撞”两个实例,深入浅出地展示了Java多线程的概念、创建与管理。 首先,我们要理解什么是线程。线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们共享进程的...

    JAVA运用多线程实现碰撞的小球

    通过JAVA运用多线程控制球的运动,通过窗口中的滑条,对球的大小和颜色进行选择后,随机从窗口左右两方择一进入,小球在遇到障碍或边界后会折回。

    小球跳动线程

    用线程实现小球跳动,展示多线程技术,可选两种颜色的小球

    java多线程应用实现示例

    在多线程环境下实现小球的运动,每个线程可能负责一个小球的运动逻辑,包括计算小球的位置变化、边界检测以及与其他小球的碰撞处理。通过定时器或者sleep()方法控制线程的执行间隔,使得小球按照设定的速度移动。这...

    VC Thread多线程执行不同任务的例子.rar

    VC 创建多个 Thread多线程,用以执行不同任务的例子,运行程序后你可看到分别有红色、蓝色的小球,在沿各自不同的轨迹做运动,在代码中,我们创建了一个小球运动线程的主函数,分别用两个线程调用这个函数,但设定的...

    小球碰撞反弹经典算法

    在IT领域,尤其是在游戏开发与动画效果实现中,小球碰撞反弹算法是一个常见的技术要点,尤其是在J2ME(Java 2 Micro Edition)平台上的应用。本文将深入解析“小球碰撞反弹经典算法”这一主题,从算法的设计思路、...

    swing+Java+多线程

    用户能通过GUI组件指定生成小球的数量,每个小球将从随机的位置出现,并具有随机颜色,随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,小球将依据受力原理改变运动方向(可简化考虑,受力...

    j2Me 小球运动的源代码 多线程开发实例

    本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动...

    MFC c++ vs2005 多线程 demo

    在"多线程两个小球"的示例中,我们将会看到如何创建并管理两个并发执行的线程,每个线程控制一个小球的运动。 首先,我们需要理解多线程的概念。在单线程程序中,所有的任务按顺序执行,而多线程则允许程序同时执行...

    小球碰撞-炫彩版

    该系统的主要功能是展示一个小球在屏幕上不断摇摆,并与其他小球发生碰撞,同时球的颜色、速度和运动方向都会因碰撞而发生变化。以下是对该项目涉及的技术点进行的详细解释: 1. **多线程**:多线程是Java的一个...

    java 小球与时钟

    6. **线程与并发**:如果小球需要实时地在屏幕上移动,可能需要在单独的线程上执行,以避免阻塞主程序的执行。同样,时钟的计时也可能在一个后台线程上进行,确保计时的准确性。 7. **碰撞检测**:在小球的运动过程...

    小球自由落体JAVA源码

    用户可以通过GUI与程序交互,例如启动/停止小球的运动,改变重力或小球数量等。 7. **事件处理**:在GUI应用中,事件处理是必不可少的,比如鼠标点击事件可能用于启动或暂停小球的运动。Java的AWT和Swing库提供了...

    运用多线程编程球体游戏

    在这个游戏中,开发者可能为每个小球创建了一个单独的线程,使得每个小球都能独立地处理它的运动逻辑,而不会相互干扰。 接着,为了实现小球的运动效果,开发者需要编写计算每个小球位置变化的逻辑。这通常涉及到...

    java窗体内的弹性小球

    这可以通过比较小球的边界与窗口边界进行计算得出。如果发生碰撞,就需要改变小球的x或y速度的符号,以模拟反向运动。速度也可以作为类的成员变量,便于调整和检查。 在事件处理方面,我们需要监听窗口关闭事件,...

Global site tag (gtag.js) - Google Analytics