`
甜甜的眼泪
  • 浏览: 15509 次
  • 性别: 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的多线程

    多线程之小球碰撞

    NULL 博文链接:https://479001499.iteye.com/blog/2092900

    小球碰撞-炫彩版

    使用到了多线程,小球不断摇摆,其余小球与之相互碰撞,方向,速度,方向,球的颜色都随之改变,java代码实现

    小球碰撞java版本

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

    java 小球弹性碰撞的练习

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

    swing+Java+多线程

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

    JAVA Swing图形用户界面编程 多线程编程 弹球游戏

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

    ballgame thread

    利用thread多线程实现多个小球的碰撞,适合初学者理解线程的创建。

    精通Java网络编程光盘资料

    提供了本书第3章的多线程应用实例的源程序; \char3\3-3\ 小球碰撞游戏 提供了本书第3章的小球碰撞游戏实例的源程序; \char4\4-1\ HostLookup 提供了本书第4章的HostLookup实例的源程序; \char4\4-2\ ...

    《java游戏程序设计教程》—实验任务书.doc

    二 实验内容 学习和了解游戏基本框架的设计方法(参考教材第3章内容及相关代码),在此基础 上设计弹跳小球游戏,实现小球在程序窗口边界反弹的效果。要求实现如下功能: 1. 创建游戏程序主窗体(GameFrame)和绘图...

Global site tag (gtag.js) - Google Analytics