java实现小球碰撞功能

本文实例为大家分享了java实现小球碰撞的具体代码,供大家参考,具体内容如下

这次我们做一个小球的碰撞的游戏,规则是:按下添加按钮,窗口的中心部分会产生一个小球(刚开始默认为黑色),四个方向随机产生,发射小球,再次按下即产生两个小球。当小球碰到窗体边缘的时候会产生反弹,当两个小球接触时会产生碰撞,双方交换速度,向相反方向移动。我们可以选择相应的颜色来改变下一个发射的小球颜色。当按下清除可以清除屏幕上的小球,当按下添加则会继续产生小球。最后我们还添加了自动产生小球的功能,按下开关,在屏幕中间会定时产生小球。接下来,我们来展示代码部分。

public class Jframe {
 private Ball[] arrayball = new Ball[100];
 public static void main(String[] args) {
 Jframe frame = new Jframe();
 frame.showUI();
 }
 public void showUI() {
 javax.swing.JFrame jf = new javax.swing.JFrame();
 jf.setSize(1000, 1000);
 jf.getContentPane().setBackground(Color.WHITE);
 jf.setTitle("小球");
 jf.setDefaultCloseOperation(3);
 // 设置居中显示
 jf.setLocationRelativeTo(null);
 JPanel jp1 =new JPanel();
 JButton jb1 = new JButton("添加");
 jp1.add(jb1);
 // jb1.setBounds(100,50, 40, 20);
 JButton jb2 = new JButton("暂停");
 jp1.add(jb2);
 // jb1.setBounds(200,50, 40, 20);
 JButton jb3 = new JButton("清除");
 jp1.add(jb3);
 // jb1.setBounds(300,50, 40, 20);
 JButton jb4 = new JButton("自动添加");
 jp1.add(jb4);
 jf.add(jp1,BorderLayout.NORTH);
  Mouse mouse = new Mouse();
 Color[] color = {Color.RED,Color.BLUE,Color.BLACK,Color.GREEN,Color.YELLOW};
 for(int i=0;i<color.length;i++){
 JButton jbu = new JButton();
 jbu.setBackground(color[i]);
 jbu.setPreferredSize(new Dimension(30, 30));
 jp1.add(jbu);
 jbu.addActionListener(mouse);
 }
 jb1.addActionListener(mouse);
 jb2.addActionListener(mouse);
 jb3.addActionListener(mouse);
 jb4.addActionListener(mouse);
 jf.addMouseListener(mouse);
 jf.addMouseMotionListener(mouse);
 BallJpanel cp = new BallJpanel();
 cp.setBackground(Color.WHITE);
 jf.add(cp,BorderLayout.CENTER);
 jf.setVisible(true);
 Graphics g = cp.getGraphics();
 mouse.setcp(cp);
 mouse.setg(g);
 mouse.setarrayball(arrayball);
 mouse.setmouse(mouse);
 cp.setarrayball(arrayball);
 }
}

这是窗体的基本配置,采用边框布局,上方放置按钮,中间是画布。我们为按钮添加了动作监听器,并使用了一系列的方法来把对象传递到其他类中。

public class Ball {
 public int size = 90; // 小球的直径
 public int x = 500; // 小球所在的x坐标
 public int y = 500; // 小球所在的y坐标
 public int vx = 5;
 public int vy = 5;
 public BallJpanel cp;
 public Color color = Color.BLACK;
 public int max_x, max_y, Min_x, Min_y;
 private Ball[] arrayball;
 public void setcp(BallJpanel cp) {
 this.cp = cp;
 }
 public void setarrayball(Ball[] arrayball) {
 this.arrayball = arrayball;
 }
 public void setX(int x) {
 this.x = x;
 }
 public int getX() {
 return x;
 }
 public void setY(int y) {
 this.y = y;
 }
 public int setY() {
 return y;
 }
 public Ball(int x, int y, int vx, int vy, Color color) {
 this.x = x;
 this.y = y;
 this.vx = vx;
 this.vy = vy;
 this.color = color;
 }
 public void ballMove(Graphics g) {
 x += vx;
 y += vy;
 max_y = cp.getHeight();
 max_x = cp.getWidth();

 if (x <= size / 2) {
 x = size / 2;
 vx = -vx;
 }
 if (y <= size / 2) {
 y = size / 2;
 vy = -vy;
 }
 if (x + size / 2 >= max_x) {
 x = max_x - size / 2;
 vx = -vx;
 }
 if (y + size / 2 >= max_y) {
 y = max_y - size / 2;
 vy = -vy;
 }
 for (int i = 0; i < arrayball.length; i++)
 {
 if (arrayball[i] == null)
 break;
 Ball ball = arrayball[i];
 if (this.equals(ball))
 continue;
 if ((ball.x - this.x) * (ball.x - this.x) + (ball.y - this.y) * (ball.y - this.y) <= size * size)
 {
 int tempvx = this.vx;
 int tempvy = this.vy;
 this.vx = ball.vx;
 this.vy = ball.vy;
 ball.vx = tempvx;
 ball.vy = tempvy;
 while ((ball.x - this.x) * (ball.x - this.x) + (ball.y - this.y) * (ball.y - this.y) <= size * size)
 {
  this.x += this.vx;
  this.y += this.vy;
  System.out.println("等待");
 }
 }
 }
 }
}

考虑到这是一个小球的运动系统,我们为小球写了一个类,添加小球的时候,会创建小球对象,并使其获得位置,颜色,速度等参数,并将其存入数组。小球的方法就是运动,每当执行ballMove方法,便会为小球修改位置坐标(基于其速度),再判断是否撞击边框,以及判断是否和别的小球有坐标重叠,如果有重叠,则跑一个循环,修改位置坐标,使其分离。Ball这部分代码和监听器中的方法有所联系,我们接下来介绍监听器的方法。

public class Mouse implements MouseMotionListener, MouseListener, ActionListener {
 private Graphics g;
 private BallJpanel cp;
 private Ball[] arrayball;
 private int index = 0;
 private int x;
 private int y;
 private int vx;
 private int vy;
 private int random=1;
 private Color color=Color.black;
 private ThreadBall tb;
 private Mouse mouse;
 public int selfFlag=0;
 public void setmouse(Mouse mouse)
 {
  this.mouse= mouse;
 }
 public void setarrayball(Ball[] arrayball) {
 this.arrayball = arrayball;
 }
 public void setg(Graphics g) {
 this.g = g;
 }
 public void setcp(BallJpanel cp) {
 this.cp = cp;
 }
 public void actionPerformed(ActionEvent e) {
 if ("添加".equals(e.getActionCommand())) {
 System.out.println("添加");
 if (tb == null) {
 // 创建线程对象
 tb = new ThreadBall();
 tb.setcp(cp);
 tb.setarrayball(arrayball);
 tb.setg(g);
 tb.start();
 tb.setmouse(mouse);
 }
 tb.stopFlag=0;
 addBall();
 }
 if ("暂停".equals(e.getActionCommand())) {
 if(tb!=null)
 {
  if(tb.stopFlag==0)
  {
   tb.stopFlag=1;
   System.out.println("暂停");
  }
  else
  {
  tb.stopFlag=0;
  System.out.println("开始");
  }
 }
 }
 if ("清除".equals(e.getActionCommand())) {
 tb.stopFlag=1;
 cp.paint1(g);
 index=0;
 System.out.println("清除");
 }
 if ("自动添加".equals(e.getActionCommand())){
 if(selfFlag==0)
 {selfFlag=1;System.out.println("自动添加打开");}
 else
 {selfFlag=0;System.out.println("自动添加关闭");}
 }
 if("".equals(e.getActionCommand())){
 JButton jbu=(JButton)e.getSource();
 color=jbu.getBackground();
 g.setColor(color);
 }
 }
 public void mouseDragged(MouseEvent e) {
 }
 public void mouseMoved(MouseEvent e) {
 }
 public void mouseClicked(MouseEvent e) {
 }
 public void mousePressed(MouseEvent e) {
 }
 public void mouseReleased(MouseEvent e) {
 }
 public void mouseEntered(MouseEvent e) {
 }
 public void mouseExited(MouseEvent e) {
 }
 public void addBall() {
 x = 500;
 y = 500;
 random=1+(int)(Math.random()*4);
 switch(random)
 {
 case 1:
 vx=5;
 vy=5;
 break;
 case 2:
 vx=-5;
 vy=-5;
 break;
 case 3:
 vx=5;
 vy=-5;
 break;
 case 4:
 vx=-5;
 vy=5;
 break;
 }
 Ball ball = new Ball(x, y,vx , vy, color);
 arrayball[index++] = ball;
 }
}

监听器中,我们设置了一系列参数来控制一些方法的开启和关闭,以及写了添加小球的方法,为其赋初值,随机一个初始发射方向。这段代码我们用到了线程。线程的使用分为两步,创建线程对象并start线程。

public class ThreadBall extends Thread {
 private Graphics g;
 private BallJpanel cp;
 private Ball[] arrayball;
 public int stopFlag=0;
 private int add=0;
 private Mouse mouse;
 public void setmouse(Mouse mouse)
 {
 this.mouse=mouse;
 }
 public void setcp(BallJpanel cp) {
 this.cp = cp;
 }
 public void setg(Graphics g)
 {
 this.g=g;
 }
 public void setarrayball(Ball[] arrayball) {
 this.arrayball = arrayball;
 }
 /**
 * 启动线程执行的方法
 */
 public void run() {
 while (true) {
   if(stopFlag==0)
   {
  for (int i = 0; i < arrayball.length; i++)
  {
  if(arrayball[i]==null)
  break;
   Ball ball = arrayball[i];
    ball.setarrayball(arrayball);
  ball.setcp(cp);
  ball.ballMove(g);
  }
  cp.paint(g);
  add++;
  if(add==5000)
  add=0;
  if(add%50==0&&mouse.selfFlag==1)
  mouse.addBall();
   }
  try {
  Thread.sleep(50);
  } catch (InterruptedException e) {
  e.printStackTrace();
  }
 }
 }
}

以上是线程的属性和方法,此类继承Thread并重写了run方法。run方法的思路是循环调用ballMove方法修改小球坐标,并调用paint方法更新显示,我们加入了一个延时函数,来控制调用的频率。

public class BallJpanel extends JPanel {
 private Ball[] arrayball;
 public void setarrayball(Ball[] arrayball)
 {
 this.arrayball=arrayball;
 }
 public void paint(Graphics g)
 {
 super.paint(g);
 for(int i=0;i<arrayball.length;i++)
 {
 if(arrayball[i]==null)
 {
 break;
 }
 Ball ball=arrayball[i];
 g.setColor(ball.color);
 g.fillOval(ball.x-ball.size/2, ball.y-ball.size/2, ball.size, ball.size);
 }
 }
 public void paint1(Graphics g)
 {
 super.paint(g);
 for(int i=0;i<arrayball.length;i++)
 {
 if(arrayball[i]==null)
 {
 break;
 }
 arrayball[i]=null;
 }
 }
}

BallJpanel类写的是画布,及小球的运动区域,画笔也是从其对象cp上获得。类里用paint写画面的重绘方法(包括画板小球的重绘),paint1用来清空画布及数组。

以上便是java小球运动的全部代码,我们来看一下效果。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java桌球小游戏 小球任意角度碰撞

    本文实例为大家分享了java桌球小游戏的具体代码,供大家参考,具体内容如下 import javax.swing.*; import java.awt.*; public class BallGame extends JFrame { /** *继承swing里面的窗口类 */ //加载图片 Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.jpg.png");/*得到系统默认的工具包*/ Image desk

  • Java编程实现游戏中的简单碰撞检测功能示例

    本文实例讲述了Java编程中的简单碰撞检测功能.分享给大家供大家参考,具体如下: 今天在家正在写一个坦克大战的小游戏来玩,遇到了一个简单的圆和圆的碰撞检测的小问题, 碰撞检测的过程处理主要有以下三步: 1.碰撞检测(Collision Detection):返回两个或多个物体是否发生碰撞的布尔判断. 2.碰撞确定(Collision Determination):找到物体之间实际相交位置. 3.碰撞响应(Collision Response):针对两个物体之间的碰撞决定采取何种操作. 下面是关于

  • java实现小球碰撞功能

    本文实例为大家分享了java实现小球碰撞的具体代码,供大家参考,具体内容如下 这次我们做一个小球的碰撞的游戏,规则是:按下添加按钮,窗口的中心部分会产生一个小球(刚开始默认为黑色),四个方向随机产生,发射小球,再次按下即产生两个小球.当小球碰到窗体边缘的时候会产生反弹,当两个小球接触时会产生碰撞,双方交换速度,向相反方向移动.我们可以选择相应的颜色来改变下一个发射的小球颜色.当按下清除可以清除屏幕上的小球,当按下添加则会继续产生小球.最后我们还添加了自动产生小球的功能,按下开关,在屏幕中间会定时

  • Java中小球碰撞并使用按钮控制数量实例代码

    刚开始实训第三天,要求java做一个小球碰撞的小游戏,啥也不会的我,决定写写啥. 先根据程序要求写了一个窗口 package three.day; import java.awt.event.*; import javax.swing.*; public class Windows extends JFrame{ DrowJPs jp=new DrowJPs(); public void init() { this.setSize(800,500); this.setLocationRelati

  • 用Java实现小球碰壁反弹的简单实例(算法十分简单)

    核心代码如下: if(addX){ x+=3; }else{ x-=3; } if(addY){ y+=6; }else{ y-=6; } if(x<=0||x>=(width-50)){ addX=!addX; } if(y<=0||y>=(height-50)){ addY=!addY; } 根据x和y递增的值,来决定角度. 以上这篇用Java实现小球碰壁反弹的简单实例(算法十分简单)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们.

  • Java实现FTP服务器功能实例代码

    FTP(File Transfer Protocol 文件传输协议)是Internet 上用来传送文件的协议.在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下载(Download).FTP是实时联机服务,在使用它之前必须是具有该服务的一个用户(用户名和口令),工作时客户端必须先登录到作为服务器一方的计算机上,用户登录后可以进行文件搜索和文件传送等有关操作,如改变当前工作目录.列文件目录.设置传输参数及传送文件等.使用FTP可以传送所有类型的文件,如文本文件.二进制可执

  • Java简单验证身份证功能示例

    本文实例讲述了Java简单验证身份证功能.分享给大家供大家参考,具体如下: package org.cxy.csdn.example; import java.util.Calendar; import java.util.HashMap; import java.util.Map; import javax.xml.bind.Validator; /** * 身份证验证的工具(支持5位或18位省份证)<br/> * 身份证号码结构: * <ol> * <li>17位数

  • Java 实现随机验证码功能简单实例

    Java 实现随机验证码功能简单实例 现在许多系统的注册.登录或者发布信息模块都添加的随机码功能,就是为了避免自动注册程序或者自动发布程序的使用. 验证码实际上就是随机选择一些字符以图片的形式展现在页面上,如果进行提交操作的同时需要将图片上的字符同时提交,如果提交的字符与服务器session保存的不同,则认为提交信息无效.为了避免自动程序分析解析图片,通常会在图片上随机生成一些干扰线或者将字符进行扭曲,增加自动识别的难度. 在这里,我们使用servlet来实现随机验证码的实现.  实现代码: p

  • java实现屏蔽词功能

    经常会看到贴吧里面屏蔽各种用户的发帖内容,当时就想这个该如何去实现.自己当时想过用字符串去替代的方式(replaceAll)去实现,但是这种效率又非常低,也不能保证最长匹配,这就是自己当时最初的想法.最近自己做的一个项目中,需要对一些内容做屏蔽,自己又对这个问题做了一次分析,最终形成下面的代码. /** *@Description: 屏蔽词功能实现 */ package cn.yicha.novel.search.util; import java.io.BufferedReader; impo

  • Java实现验证码验证功能

    Java如何实现验证码验证功能呢?日常生活中,验证码随处可见,他可以在一定程度上保护账号安全,那么他是怎么实现的呢? Java实现验证码验证功能其实非常简单:用到了一个Graphics类在画板上绘制字母,随机选取一定数量的字母随机生成,然后在画板上随机生成几条干扰线. 首先,写一个验证码生成帮助类,用来绘制随机字母: <span style="font-size:14px;">import java.awt.Color; import java.awt.Font; impo

  • JS自定义对象实现Java中Map对象功能的方法

    本文实例讲述了JS自定义对象实现Java中Map对象功能的方法.分享给大家供大家参考.具体分析如下: Java中有集合,Map等对象存储工具类,这些对象使用简易,但是在JavaScript中,你只能使用Array对象. 这里我创建一个自定义对象,这个对象内包含一个数组来存储数据,数据对象是一个Key,可以实际存储的内容!   这里Key,你要使用String类型,和Java一样,你可以进行一些增加,删除,修改,获得的操作. 使用很简单,我先把工具类给大家看下: 复制代码 代码如下: /**  *

  • jQuery实现的分子运动小球碰撞效果

    本文实例讲述了jQuery实现的分子运动小球碰撞效果.分享给大家供大家参考,具体如下: 先看效果图吧,因为小球是运动状态的,不好截图,这里就先大体画了一下路线,表示大体意思吧,如果想看真实的效果,自己粘贴下去运行: 小球有点小哟,嘿嘿,没有对细节进行详细的处理,如果像让它完美一点,自己处理下吧!这里是模拟的理想状态下的,没有摩擦力与组里的分子碰撞运动,高科技哟~~~~~~mu~a 代码也没有整理,如果有心的话,把它整理成面向对象形式的吧! 代码如下: <!DOCTYPE html PUBLIC

随机推荐