cnmm22 原创。

用我的方法,你可以在java 里实现精确的斜角矩形,平行四边形,不规则矩形,不规则多边形与圆形的碰撞检测。

我们知道,在java 里有一个类,x.getRect().intersects(x1.getRect() 可以实现规则矩形的碰撞检测:

这是无法容忍的“碰撞检测”。这不是我要的游戏效果。

在使我的方法后:

cnmm22 原创,转载请随意。

实现方法:我们必须把所有的碰撞分为两类:与圆形和与多边形。

圆形与圆形解决方案:检测两个碰撞对象的圆心距离,跟两者半径之和做比较。

我把要使用的方法都封装好了,以便您直接使用 :

/** 步骤一、检测两个圆心距离 */

public static double getDistance(Point p, double ox, double oy) {

double _x = Math.abs(ox - p.x);

double _y = Math.abs(oy - p.y);

return Math.sqrt(_x * _x + _y * _y);

}

每一张圆形的透明 png圆形图片,我们都有一个尺寸大小,我们按尺寸大小,得到其半径。

而要碰撞的两个圆心坐标我们是很好得到的,这个相信我不须解释。

/* 步骤二、检测两个圆心距离,与两者半径之和做比较,范例代码:/

.

Point p1 = new Point(x + W / 2, y + H / 2);

if (Unit.getDistance(p1, w.yx, w.yy) < w.yr) {

.

以上就完成了圆形的碰撞检测。

多边形:骚复杂点,。

解决方案:1、描边,2,检测边到点距离。

例如这个图形:

先描出4个定点,这样,能以这4个点组合成4条线段。在分别检测每一条线段与对象中心的距离即可。

示例代码:

……………………….

img = tk.getImage(Wall.class.getClassLoader().getResource("images/4/k8.png"));

rx1 = 1;

rx2 = 14784;

w = 168;

h = 88;

rx3 = 2;

x3 = x;

y3 = y + 5;

w3 = w - 15;

h3 = h - 5;

px11 = x + 14;

px12 = y + 35;

px21 = x + 136;

px22 = y + 7;

px31 = x + 4;

px32 = y + 85;

px41 = x + 149;

px42 = y + 53;

……………………….

px11,px12,是它的第一个点,px21,px22,是它的第二个点,以此类推。x,y是这张矢量图最左上角滴点,不管那个点有没有像素,或者是透明,它都是 x, y。这样通过图像工具,我们很容易得到一组 px1-pxn, px12-pxn2。

示例代码:(分别检测每一条线段与对象中心的距离)

if (Unit.pointToLine(w.px11, w.px12, w.px21, w.px22, x + W / 2, y + H / 2) < 24) {

stay();

return true;

}

if (Unit.pointToLine(w.px11, w.px12, w.px31, w.px32, x + W / 2, y + H / 2) < 24) {

stay();

return true;

}

if (Unit.pointToLine(w.px31, w.px32, w.px41, w.px42, x + W / 2, y + H / 2) < 24) {

stay();

return true;

}

if (Unit.pointToLine(w.px21, w.px22, w.px41, w.px42, x + W / 2, y + H / 2) < 24) {

stay();

return true;

其中 x + W / 2, y + H / 2 ,是点坐标,24是检测距离。以上只是范例。

/** 封装方法:检测边到点距离 */

static double pointToLine(int x1, int y1, int x2, int y2, int x0, int y0) {

double space = 0;

double a, b, c;

a = lineSpace(x1, y1, x2, y2);// 线段的长度

b = lineSpace(x1, y1, x0, y0);// (x1,y1)到点的距离

c = lineSpace(x2, y2, x0, y0);// (x2,y2)到点的距离

if (c <= 0.000001 || b <= 0.000001) {

space = 0;

return space;

}

if (a <= 0.000001) {

space = b;

return space;

}

if (c * c >= a * a + b * b) {

space = b;

return space;

}

if (b * b >= a * a + c * c) {

space = c;

return space;

}

double p = (a + b + c) / 2;// 半周长

double s = Math.sqrt(p * (p - a) * (p - b) * (p - c));// 海伦公式求面积

space = 2 * s / a;// 返回点到线的距离(利用三角形面积公式求高)

return space;

}

无论如何,解决多边形碰撞检测,描边将会是一个相当大工作量的工作,但是一旦使用熟练后,其实也是相当简便。因为有图形工具。

这样就很迅速得到了 px11,px12,px21,px22 ;px31,px32,px41,px42 类似。

以上就完成了不规则矩形的碰撞检测。

那多边形怎样检测?

多边形方法类似,多描几条边出来,再分辨判断点到线距离即可。我就不在赘述了。

假设要检测的对象是一个椭圆又怎吗办?

你可以参考这样的方法:

记住,你描的边越多,精确度越高,工作量越大。

使用我的方法,你可以最大限度提高碰撞检测的精确程度,并且可以避免像素级碰撞检测带来的巨大性能损耗,若碰撞的对象为多边形与多边形碰撞,或多边形与曲线碰撞,无法使用我的方法检测,而实际中,这种碰撞很少,这种情况下,可以建立像素矩阵,一般的做法比如一个200*200像素的图片,我们则需要做一个[200]*[200]的数组,进行约40000次的遍历,来完成1帧里滴碰撞检测,还要考虑到透明度的计算,其性能消耗相当可观。

java碰撞检测代码_java 实现精确碰撞检测。相关推荐

  1. java 定时器代码_Java定时器代码的编写

    Java定时器代码的编写 在某些时候, 我们需要实现这样的`功能,某一程序隔一段时间执行一次,而这一事情由系统本身来完成,并不是人为的触发,我们一般可称此为定时器任务.其实到Java中,实现起来是非常 ...

  2. java 编写代码_Java 7:如何编写非常快速的Java代码

    java 编写代码 当我第一次写此博客时,我的目的是向您介绍ThreadLocalRandom类,它是Java 7中新增的用于生成随机数的类. 我在一系列微基准测试中分析了ThreadLocalRan ...

  3. java游戏代码_Java与Kotlin系列文章之性能问题详解

    作者丨Jakub Anioła 译者丨姜雨生 策划丨田晓旭 随着对 Kotlin 越来越深入的了解,我发现市面上关于 Kotlin 方面,比较深入的资料几乎是 0,所以我决定,将 Kotlin 各个方 ...

  4. java四则运算代码_Java实现简单四则运算

    GitHub 项目地址 PSP PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 10 · Estima ...

  5. java 文件下载代码_java文件下载代码实例(单文件下载和多文件打包下载)

    这篇文章主要介绍了java文件下载代码实例(单文件下载和多文件打包下载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近项目有需要写文件下载相关 ...

  6. java float 加法_JAVA 实现精确的加减乘除运算

    JAVA在加减乘除运算时易发生精度丢失,达不到我们想要的计算结果:为了能够精确表示.计算浮点数,JAVA提供了BigDecimal类,可以以BigDecimal为基础定义一个Arith工具类,代码如下 ...

  7. java 股票 代码_Java中利用散列表实现股票行情的查询_java

    ---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的.本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法. ...

  8. java坐标代码_Java实现地理坐标判断

    Java实现地理坐标判断 在做一个海洋相关的项目时候,遇到这个需求,判断船只是否在雷达监控的区域内,或者是否在某个保护区内.抽象为在地理位置中,一个坐标点是否在由一个圆心和半径的圆区域内,一个点是否在 ...

  9. java算小数_Java 小数精确计算问题

    Java 小数精确计算问题 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是0.9,而是一连串的小数.问题在于1.1 这个 ...

  10. java时间代码_java获取当前时间的四种方法代码实例

    这篇文章主要介绍了java获取当前时间的四种方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种:Date类 public class ...

最新文章

  1. 读阿里机器学习平台的一些总结
  2. Golang实现简单爬虫框架(4)——队列实现并发任务调度
  3. 【杂谈】什么是我心目中深度学习算法工程师的标准
  4. 阿里P8大佬亲自教你!java程序设计第四版pdf
  5. 我试了试用 SQL查 Linux日志,好用到飞起
  6. 组成新数python_python练习题
  7. linux 引导管理器,linux系统引导管理器GRUB
  8. css table设置边框_table布局的一些总结
  9. android使用greedao踩坑日记
  10. matlab怎么对图片mesh,MATLAB提供了mesh函数和surf函数来绘制三维曲面图。
  11. 异常错误 - MySQL导入时错误
  12. HSRP热备份路由协议配置详解
  13. Java常用中间件---SpringBoot整合ActivityMQ
  14. linux怎么卸载vsftpd软件,vsftpd配置详解之软件安装和卸载
  15. 操作系统--虚拟内存
  16. 鸿蒙系统,鸿蒙app简易登录界面,界面开发教程
  17. 《PyCharm2019安装教程》
  18. QT全自动检测,挂载U盘
  19. 计算机文化基础形考作业,(精华版)国家开放大学电大专科《计算机文化基础》网络课形考任务6作业及答案(2页)-原创力文档...
  20. zblog插件-zblog搜狗推送插件

热门文章

  1. SpringBoot整合腾讯云直播,生成推拉流配置及工具类详细讲解!
  2. Java——通过Java代码从ftp服务器下载文件
  3. idea 设置全局豆沙绿
  4. office 2010 激活 toolkit.exe 应用程序正常初始化失败
  5. 关于模板函数声明与定义的问题
  6. 计算机桌面声音图标,win7桌面右下角的小喇叭音量图标不见了怎么办?
  7. Excel文件编辑保护如何取消?
  8. You Only Watch Once(YOWO)
  9. 【笔记】2022.06.20 python数据分析三大神器numpy、pandas、matplotlib
  10. mysql监听显示syn_sent,TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ......