`
甜甜的眼泪
  • 浏览: 16296 次
  • 性别: Icon_minigender_2
社区版块
存档分类
最新评论

小球碰撞之多线程实现

 
阅读更多

                                                       小球碰撞游戏

  小球碰撞,首先需要创建一个窗体,相信大家都会创建窗体。然后从窗体上获取画布。紧接着大家都会想到也都会做的就是在  创建一个监听器然后画一个圆。接着我们就会考虑怎么让这个圆动起来,怎么重绘,怎么使圆看起来更漂亮,看起来像一个球一样,又怎么让小球碰在一起又弹开。然后大家会处理一些细节问题,如可以让球可以停下来,然后可以让球恢复过来,怎么加背景。(加动态背景在下篇博客中我将要再写)

      首先创建窗体,我们会考虑到在窗体上加几个按钮,如有控制加小球的按钮,有控制小球停止的按钮,有恢复小球运动的按钮。在小球运动的时候显然小球会把按钮擦去。针对这个问题,我在窗体上加了3个JPanel。第一个面板可以直接加到窗体上,把面板1设置成borderlayout布局。然后将面板二加到面板上的North或者其他位置。把第三个面板加到第一个center位置。然后从面板3上获取画布。代码如下:

 

//在窗体上加一个面板,使窗体变成白色
		jpl=new MyJpanel();
		jpl.setBackground(Color.WHITE);
		this.add(jpl);
		//布置这个面板的布局便于让小球从撒小球这个按钮下面出来
		jpl.setLayout(new BorderLayout());
		//再在上一个面板的北方即上面加一个面板,使其更漂亮
		jp2=new MyJpanel();
		 //设置就jp2的布局
		jp2.setLayout(new FlowLayout());
		jp2.setBackground(Color.WHITE);
		jpl.add(jp2,BorderLayout.NORTH);
		jb=new JButton("撒小球");
		//把小球加到面板的上方
		jp2.add(jb);
		jb1=new JButton("暂停");
		//把小球加到面板的上方
		jp2.add(jb1);
		jb2=new JButton("恢复");
		//把小球加到面板的上方
		jp2.add(jb2);
		//在最底层的面板上中心位置再加一个面板
	   jp3=new MyJpanel();	
	   jp3.setBackground(Color.white);
	   jpl.add(jp3,BorderLayout.CENTER);

      接下来可以把面板一设置成流体布局,在上面加3个按钮,撒小球,暂停,恢复。在按钮上加上一个监听器,这个监听器继承接口ActionListener。获取按钮上的内容,如果获得按钮上的内容是撒小球时,则向下撒一个小球。要想实现每点击一下撒小球的按钮就出来一个球。则需要加一个创建一个小球范型。代码如下:

public static List<Ball> listballs = new ArrayList<Ball>();
String command = e.getActionCommand();
		if (command.equals("撒小球")) {
			Ball ball = new Ball(this.jp5,this.listballs);
			ball.start();
			listballs.add(ball);
		}

 这样就实现了每点击一下撒小球按钮就出现一个小球。接下来就要创建和写小球Ball类了。因为想要小球运动。这样的话我们就用到线程了。线程就是通过一个程序产生几个进程的效果。他是每隔一段时间就执行一下。因此就可以达到每隔一段时间小球到达一个位置,在这样连续下就可以看做小球的运动。怎么运用线程类呢?通过继承Thread类或继承Runable接口。调用他们的run方法并且重写run方法。代码如下:

// 运用线程
	public void run() {
		// 调用父类的run方法
		super.run();
		// 当判断一致成立时 ,也就是当判断为真时
		while (true) {
			if (!pauseflag) {
				continue;
			}

			try {
			
				
				//判断小球的碰撞
				
				Thread.sleep(100);
				move();
			} catch (InterruptedException e) {

				e.printStackTrace();
			}
			
		}

	}

 Thread.sleep(100);是指每隔0.1S就执行一下run方法中的内容。可以通过在run方法中改变球圆心(x,y)的坐标来改变球的位置。于是我在下面写了move函数。在该函数中可以写关于圆心坐标改变的表达式,也可以写关于小球碰撞的表达式。代码如下:

public void move(){
    	x+=stepx;
		y+=stepy;
		// 为什么把这个写到构造函数中就不可以了呢 构造函数只执行一次run方法是一直执行的
		// 一般在run方法中是无限循环执行的
		// 执行某项任务
		if (x <= r) {
			//System.out.println("1111");
			stepx =Math.abs(stepx);
		}
		//很不理解为什么要在这里写成y <= r
		if (y <= r) {
			stepy = Math.abs(stepy);
		}
		if (x >= (jp4.getWidth() - r)) {
			stepx = -Math.abs(stepx);
		}
		if (y >= (jp4.getHeight() - r)) {
			stepy = -Math.abs(stepy);
		}
		

 在move函数中stepx,stepy是在x,y方向上的增量。如果想要小球从不同的方向出来,可以随机取得一个stepx的值这样在同一个点小球的出来方向不同。如果执行执行程序时,每隔0.1sx,y就变化一下。

if (x <= r) {
			//System.out.println("1111");
			stepx =Math.abs(stepx);
		}

 这句代码表示,当小球碰到面板3的左侧时,改变x的增量。使其方向改变,其他3个判断句读者可以举一反三。但是这样出来的小球运动会出现问题。小球前面的轨迹不能擦除。我们可以想出两个办法擦去原来的轨迹,第一,可以写一个Clear方法,在draw小球前把原来的位置用背景的颜色填充。我是用第二个方法。第二个方法就是用重绘的方法加上线程。代码如下:

new Thread(){
			public void run(){
				while(true){
					//repaint会直接执行paint中的方法
					jp3.repaint();
					try{
						Thread.sleep(10);
					}catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				}
				
					
		}.start();

 

 

每个画布都有默认的paint方法。在这个线程里,每隔一段时间调用一下paint方法。而我是在paint方法中画的球。这样就每隔一段时间显示这个球在不同的位置。这样前面的痕迹就不会再出现了。就写到这里了,明天我将要续写,写上怎么把球画的有立体感,怎么把暂停,恢复怎么加动态背景。晚安,世界。                             

 

 

 

 

 

 

 

 

分享到:
评论
2 楼 come_for_dream 2014-03-25  
期待明天杰作
1 楼 come_for_dream 2014-03-25  
     灰常灰常不错哈

相关推荐

    多线程之小球碰撞

    标题“多线程之小球碰撞”涉及到的是计算机编程中的多线程技术,结合描述中的博文链接,我们可以推测这篇文章可能是通过一个模拟小球碰撞的示例来讲解多线程编程的概念和实践。在这个场景中,每个小球可以代表一个...

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

    总的来说,通过“JAVA多线程实验,字符移动、小球碰撞”这两个案例,我们可以学习到如何在Java中创建线程、实现线程间的通信和同步,以及如何有效地管理线程资源。这些知识对理解和编写高效的并发程序至关重要,是每...

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

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

    小球碰撞-炫彩版

    在"小球碰撞-炫彩版"这个项目中,开发者运用了Java编程语言来实现一个动态的、基于多线程的模拟系统。该系统的主要功能是展示一个小球在屏幕上不断摇摆,并与其他小球发生碰撞,同时球的颜色、速度和运动方向都会因...

    多个小球的碰撞

    7. **多线程**:为了保持程序的流畅性,动画的渲染和小球的物理计算可能需要在不同的线程中进行,以避免阻塞主线程。 在实际编码过程中,你可能会创建一个ManyBalls类,它包含一个ArrayList或其他集合类型的变量来...

    小球碰撞反弹经典算法

    总之,“小球碰撞反弹经典算法”在J2ME平台上的实现不仅体现了算法设计的精巧之处,也展现了开发者对计算效率和物理仿真平衡点的精准把握。通过对算法原理的深入理解和代码实践,我们能够更好地应用于各种游戏开发...

    VC++课程设计之小球碰撞演示

    在本篇中,我们将深入探讨"VC++课程设计之小球碰撞演示"这一主题,它涉及到计算机编程、图形渲染以及物理模拟等多个领域的知识。在这个项目中,学生利用Microsoft的Visual C++(VC++)集成开发环境,特别是MFC...

    java多线程控制小球程序

    要实现这个小球弹跳的多线程程序,我们需要以下步骤: 1. **创建线程类**:首先,我们需要定义一个表示小球运动的类,比如`BouncingBall`,该类需要继承自`Thread`或实现`Runnable`接口。如果选择继承`Thread`,...

    小球碰撞java版本

    采用多线程的方式模拟小球碰撞的图形化方式

    java小球碰撞边框反弹并且互相碰撞消失

    综上所述,开发这样一个Java小球碰撞游戏涉及到了GUI设计、对象模型、物理运动模拟、边界和碰撞检测、事件处理、多线程编程以及图形更新等多个核心编程概念。理解并掌握这些知识点,对于提升Java编程能力非常有帮助...

    java多线程应用实现示例

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

    【仿真研究】matlab多个小球碰撞,有背景颜色,支持更换小球个数,有注解.rar

    - 动量守恒:在理想情况下,小球碰撞过程中总动量保持不变,即碰撞前后的动量之和相等。 - 能量守恒(弹性碰撞):如果小球间的碰撞是完全弹性的,那么碰撞前后系统的动能总和也保持不变。 3. MATLAB编程实现: ...

    delphi做的小球碰撞和6.7卡拉OK字幕

    本文将深入探讨Delphi在实现两个典型应用上的实例——小球碰撞模拟和卡拉OK字幕显示,旨在为Delphi初学者提供有价值的参考。 首先,让我们了解一下小球碰撞模拟项目。这个项目是一个典型的物理模拟示例,它能够帮助...

    Java编写小球线程动画

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

    java 小球弹性碰撞的练习

    做的一个练习,小球沿窗体内侧碰撞,采用的多线程方法。

    java小球碰撞、学生信息管理系统实训报告.doc

    Java小球碰撞的实现主要涉及多线程编程和图形用户界面(GUI)设计。在这个实训项目中,学生被要求利用Java的Swing库来创建一个包含多个在指定区域内移动并碰撞的小球。下面将详细阐述相关知识点: 1. **Swing GUI...

    java实现的小球蹦撞

    ### Java实现的小球碰撞知识点详解 #### 一、项目背景与功能概述 本项目通过Java实现了小球在界面上的运动以及碰撞效果。程序中,用户可以添加不同颜色、速度的小球,并设置小球的起始位置。小球在面板上进行随机...

    swing+Java+多线程

    随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,小球将依据受力原理改变运动方向(可简化考虑,受力只改变小球的运动方向,小球仍按照初始速度匀速运动,且不考虑小球之间的碰撞)。...

    多线程实例:桌面智能弹球小游戏

    "多线程"是游戏的核心特性之一,它使得游戏的各个部分可以在不同的线程上同时运行,如用户界面的更新和小球的物理计算,从而提高程序的响应速度和性能。这种并发执行的能力对于保持游戏流畅运行至关重要,特别是在...

Global site tag (gtag.js) - Google Analytics