首先必须了解两个物体,在移动时,会有怎样的效果,比如沪我们小时候耍过的坦克大战。看起来很简单,但是写起代码来,复杂的要多;

下面举个例子:

// 构造一个新的 Rectangle,其左上角的坐标为 (0,0),其宽度和高度由同名的参数指定。

public Rectangle(int width, int height)

// 构造一个新的 Rectangle,其左上角被指定为 (x,y),其宽度和高度由同名的参数指定。

public Rectangle(int x, int y, int width, int height)

和碰撞检测相关的方法:

// 计算此 Rectangle 与指定 Rectangle 的交集

public Rectangle intersection(Rectangle r)

// 确定此 Rectangle 是否与指定的 Rectangle 相交

public boolean intersects(Rectangle r)

如果两个Rectangle对象有交集,那么他们就有碰撞了。如:

这种方法适用于地图中的物体近似为矩形或者虽然不是矩形,但是碰撞精度要求不高的情况下的碰撞检测。每个物体记录一个能够将自己框住的最小矩形的左上角坐标和矩形长宽。

采用此种方法进行碰撞检测需要注意,对于图片的实现处理应该尽量的去掉图标边角的空白,不然实际效果可以产生肉眼可辨的误差。也就是说Rectangle尽量的包住图形且Rectangle的区域尽量小。

示例:

import java.awt.Graphics;

import java.awt.Image;

import java.awt.MediaTracker;

import java.awt.Point;

import java.awt.Rectangle;

import java.awt.Toolkit;

import java.awt.image.CropImageFilter;

import java.awt.image.FilteredImageSource;

import java.awt.image.ImageFilter;

import java.awt.image.ImageProducer;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

/**

* 碰撞检测测试,判断两个同方向移动的坦克是否会发生碰撞

*

*@author 小明

*

*/

public class Intersection extends JFrame implements Runnable {

private static final long serialVersionUID = 156638225301569550L;

private MediaTracker mediaTracker; // 媒体追踪器

private Image[][] images = new Image[2][4]; // 放置所有切割的图像

private Image[] moveTanks = new Image[2]; // 放置界面移动的两辆坦克

private Point[] points = new Point[2]; // 两辆坦克坐标

public Intersection() {

setTitle("碰撞检测");

setSize(200, 600);

setLocationRelativeTo(null);

setDefaultCloseOperation(EXIT_ON_CLOSE);

cutImage(); // 切割图形

/* 将切割的图形添加到媒体追踪器中跟踪 */

mediaTracker = new MediaTracker(this);

for (int i = 0, length = images.length; i < length; i++) {

for (int j = 0, len = images[i].length; j < len; j++) {

mediaTracker.addImage(images[i][j], i * len + j);

}

}

// 等待所有图像加载完毕

try {

mediaTracker.waitForAll();

} catch (InterruptedException e) {

e.printStackTrace();

}

// 初始化两辆坦克在窗体中坐标

moveTanks[0] = createImage(images[0][0].getSource());

moveTanks[1] = createImage(images[0][0].getSource());

points[0] = new Point(80, 200);

points[1] = new Point(80, 100);

setVisible(true);

}

/**

* 图像分割

*/

private void cutImage() {

// 获取源图像

Image img = Toolkit.getDefaultToolkit().getImage("images/boss.gif");

// 循环分割图像

for (int i = 0, length = images.length; i < length; i++) {

for (int j = 0, len = images[i].length; j < len; j++) {

ImageFilter filter = new CropImageFilter(0, 0, 50, 50);

ImageProducer producer = new FilteredImageSource(

img.getSource(), filter);

images[i][j] = createImage(producer); // 将分割后图像放入数组中保存

}

}

}

@Override

public void paint(Graphics g) {

Image img = createImage(this.getWidth(), this.getHeight());

Graphics graphics = img.getGraphics();

// 将两辆坦克在窗体中绘制出来

for (int i = 0, len = moveTanks.length; i < len; i++) {

graphics.drawImage(moveTanks[i], points[i].x, points[i].y, this);

}

g.drawImage(img, 0, 0, this);

g.dispose();

}

@Override

public void run() {

while (true) {

// 每次第二辆坦克移动距离比第一辆坦克大,即第二辆移动更快一些

points[0].y += 30;

points[1].y += 45;

// 重绘

repaint();

/* 碰撞检测 */

// 第一辆坦克的矩形范围

Rectangle tank1 = new Rectangle(points[0].x, points[0].y,

moveTanks[0].getWidth(null), moveTanks[0].getHeight(null));

// 第二辆坦克的矩形范围

Rectangle tank2 = new Rectangle(points[1].x, points[1].y,

moveTanks[1].getWidth(null), moveTanks[1].getHeight(null));

// 判断两个矩形是否有交集,有则说明碰撞了

if (tank1.intersects(tank2)) {

JOptionPane.showMessageDialog(null, "碰到了", "提示",

JOptionPane.INFORMATION_MESSAGE);

break;

}

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

new Thread(new Intersection()).start();

}

}

当同方向移动时,两坦克发生碰撞,结果:

圆形碰撞检测

圆形检测与矩形检测方法类似,区别在于用一个能够包含物体的圆代替了矩形。主要是考虑到游戏中的物体外形以平滑为主,例如人物角色。而判断两个圆是否碰撞的计算也很简单,就是判断两个圆心之间的距离是否小于两个圆的半径之和。

示例:

import java.awt.Graphics;

import javax.swing.JFrame;

import javax.swing.JOptionPane;

/**

* 碰撞检测测试,判断两个圆是否会发生碰撞

*

*@author 小明

*

*/

public class Intersection2 extends JFrame implements Runnable {

/* 定义两圆左上角坐标、半径 */

private int x1 = 15, y1 = 45;

private int x2 = 35, y2 = 70;

private int r1 = 16, r2 = 18;

public Intersection2() {

setTitle("碰撞检测");

setSize(200, 600);

setLocationRelativeTo(null);

setDefaultCloseOperation(EXIT_ON_CLOSE);

setVisible(true);

}

@Override

public void paint(Graphics g) {

/* 画圆 */

g.drawOval(x1, y1, 2 * r1, 2 * r1);

g.drawOval(x2, y2, 2 * r2, 2 * r2);

}

@Override

public void run() {

/* 判断两圆是否相交 */

// 两圆中心坐标

int centerX1 = x1 + r1, centerY1 = y1 + r1;

int centerX2 = x2 + r2, centerY2 = y2 + r2;

// 求两圆的圆心距

double length = Math.sqrt(Math.pow(centerX1 - centerX2, 2)

+ Math.pow(centerY1 - centerY2, 2));

// 判断圆心距与两圆半径和的关系

if (length < (r1 + r2)) {

JOptionPane.showMessageDialog(null, "圆心距:" + length + ",碰撞了");

} else {

JOptionPane.showMessageDialog(null, "圆心距:" + length + ",未碰撞");

}

}

public static void main(String[] args) {

new Thread(new Intersection2()).start();

}

}

运行结果:

将第一个圆半径改为18,则:

java两个小球相撞_JAVA小游戏之两个物体碰撞产生的碰撞检测相关推荐

  1. 【源码+教程】Java课设项目_12款最热最新Java游戏项目_Java游戏开发_Java小游戏_飞翔的小鸟_王者荣耀_超级玛丽_推箱子_黄金矿工_贪吃蛇

    马上就要期末了,同学们课设做的如何了呢?本篇为大家带来了12款热门Java小游戏项目的源码和教程,助力大家顺利迎接暑假![源码+教程]Java课设项目_12款最热最新Java游戏项目_Java游戏开发 ...

  2. 【源码+图片素材】Java开发经典游戏飞翔的小鸟_Java游戏项目Flappy Bird像素鸟游戏_Java小游戏_Java初级项目_Java课程设计项目

    开发环境: jdk1.8 开发工具: IDEA JavaEE基础: 变量.数据类型.判断语句.循环结构.数组.集合.简单窗口创建.图形图片绘制.双缓存技术.事件-键盘事件.物体的碰撞检测.File [ ...

  3. Java开发学习之如何编写小游戏

    教大家如何用JAVA写一个简单的桌球小游戏,实现的效果是一个桌球能指定在球台内滚动,实现效果如下: 1.第一步创建窗口,引用两个包,后面要继承它的类 import java.awt.*; import ...

  4. Java Swing 经典小游戏《飞机大战》———— (四)碰撞检测 游戏状态与得分 玩家升级

    前期回顾 Java Swing 经典小游戏<飞机大战>---- (一)获取素材,创建窗口,添加滚动背景,双缓冲 Java Swing 经典小游戏<飞机大战>---- (二)玩家 ...

  5. 用JAVA写一款自己的小游戏

    用JAVA写一款自己的小游戏 我目前也处于一个学习的阶段,所以代码会有很多的错误,但是经过我几天的瞎调试目前还是可以玩的,但是可玩性还是很差 说一说怎么玩这个游戏把 设计初衷:KoalaChess,顾 ...

  6. Java实现的经典坦克大战小游戏

    Java实现的经典坦克大战小游戏 先看一下游戏结构: 有点多,没有耐心的可以不用看,这里先给出链接吧! 云链接:经典坦克大战 提取码:s9ai 这里就不介绍功能了,贴了一张游戏运行的截图,具体的功能自 ...

  7. 使用java完成一个猜数字的小游戏(数据范围在1-100之间)

    最近开始学java,使用java做一个猜数字的小游戏,代码不多,我就直接贴代码了 /** A:案例演示* 需求:猜数字小游戏(数据在1-100之间)*/import java.util.Scanner ...

  8. java面向对象思想编写原谅帽小游戏 原谅帽游戏思路解析

    java面向对象思想编写原谅帽小游戏 原谅帽游戏思路解析: 面向对象思想 作品展示 类(游戏端)继承Frame: 首先要创建一个方法去让游戏开始和结束 使用text执行这个游戏的方法(需要有游戏标题和 ...

  9. 计算机毕业设计-基于Java的GUI实现贪吃蛇小游戏

    标题:基于Java多线程版本GUI贪吃蛇小游戏 1.项目技术点 1.多线程的运用. 2.JAVA的GUI的运用. 3.数据结构的灵活运用. 4.随机食物的生成. 5.关卡加速,随着蛇身增长,蛇的速度也 ...

最新文章

  1. 美国三院院士「迈克尔•乔丹」长文论述:为什么说「人工智能革命」尚未发生...
  2. 前端的面试之旅(一)
  3. 单机/伪分布式Hadoop2.4.1安装文档
  4. vue 数值 拼接字符串_【Vue原理】Compile - 白话版
  5. mysql mongodb b树_为何Mongodb索引用B树,而Mysql用B+树?
  6. Webrtc服务器搭建转
  7. 一个成功的Jsp程序员该怎样学习JSP呢?
  8. Android 中shape的使用(圆角矩形)
  9. [转载] python截取指定字符串_python字符串截取,python字符串切片的方法详解
  10. 回天科技工程师房工对十大硬盘数据恢复软件简评!
  11. 阿铭Linux_传统IDC 部署网站学习笔记20190121
  12. 【全志T113-S3_100ask】9-音频输入与输出(amixer、aplay、arecord)
  13. 北京儿研所自制药一览表,宝妈们必读!转
  14. 轻量级Qt键盘-介绍篇
  15. IDEA “Cannot resolve symbol” 解决办法
  16. 全球名校课程作业分享系列(9)--斯坦福CS231n之RNN与计算机看图说话
  17. 超级微商系统开发,社交电商3.0时代的概念
  18. 二叉树的深度 | 分治 +回溯 + 迭代
  19. 2021年「博客之星」参赛博主:dnbug Blog
  20. P2504 [HAOI2006]聪明的猴子 题解

热门文章

  1. html5点击事件_lt;detailsgt; | HTML5 详细内容标签
  2. java date 时分秒_java Date 获得时分秒代码
  3. hive 修改分区备注_hive修改 表/分区语句
  4. 个位数统计(java)
  5. Java 并发编程之同步工具类栅栏 CyclicBarrier
  6. 鸿蒙系统-手机-JS FA(Feature Ability)调用Java PA(Particle Ability)
  7. 中移4G模块-ML302-OpenCpu开发-ADC
  8. tshark查看、指定网卡
  9. 数据分箱6——分箱结果进行WOE转化
  10. Flink java wordcount案例(批处理、流处理)