java碰撞检测代码_java 实现精确碰撞检测。
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 实现精确碰撞检测。相关推荐
- java 定时器代码_Java定时器代码的编写
Java定时器代码的编写 在某些时候, 我们需要实现这样的`功能,某一程序隔一段时间执行一次,而这一事情由系统本身来完成,并不是人为的触发,我们一般可称此为定时器任务.其实到Java中,实现起来是非常 ...
- java 编写代码_Java 7:如何编写非常快速的Java代码
java 编写代码 当我第一次写此博客时,我的目的是向您介绍ThreadLocalRandom类,它是Java 7中新增的用于生成随机数的类. 我在一系列微基准测试中分析了ThreadLocalRan ...
- java游戏代码_Java与Kotlin系列文章之性能问题详解
作者丨Jakub Anioła 译者丨姜雨生 策划丨田晓旭 随着对 Kotlin 越来越深入的了解,我发现市面上关于 Kotlin 方面,比较深入的资料几乎是 0,所以我决定,将 Kotlin 各个方 ...
- java四则运算代码_Java实现简单四则运算
GitHub 项目地址 PSP PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟) Planning 计划 10 10 · Estima ...
- java 文件下载代码_java文件下载代码实例(单文件下载和多文件打包下载)
这篇文章主要介绍了java文件下载代码实例(单文件下载和多文件打包下载),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近项目有需要写文件下载相关 ...
- java float 加法_JAVA 实现精确的加减乘除运算
JAVA在加减乘除运算时易发生精度丢失,达不到我们想要的计算结果:为了能够精确表示.计算浮点数,JAVA提供了BigDecimal类,可以以BigDecimal为基础定义一个Arith工具类,代码如下 ...
- java 股票 代码_Java中利用散列表实现股票行情的查询_java
---- 在java中,提供了一个散列表类Hashtable,利用该类,我们可以按照特定的方式来存储数据,从而达到快速检索的目的.本文以查询股票的收盘数据为例,详细地说明java中散列表的使用方法. ...
- java坐标代码_Java实现地理坐标判断
Java实现地理坐标判断 在做一个海洋相关的项目时候,遇到这个需求,判断船只是否在雷达监控的区域内,或者是否在某个保护区内.抽象为在地理位置中,一个坐标点是否在由一个圆心和半径的圆区域内,一个点是否在 ...
- java算小数_Java 小数精确计算问题
Java 小数精确计算问题 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是0.9,而是一连串的小数.问题在于1.1 这个 ...
- java时间代码_java获取当前时间的四种方法代码实例
这篇文章主要介绍了java获取当前时间的四种方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种:Date类 public class ...
最新文章
- 读阿里机器学习平台的一些总结
- Golang实现简单爬虫框架(4)——队列实现并发任务调度
- 【杂谈】什么是我心目中深度学习算法工程师的标准
- 阿里P8大佬亲自教你!java程序设计第四版pdf
- 我试了试用 SQL查 Linux日志,好用到飞起
- 组成新数python_python练习题
- linux 引导管理器,linux系统引导管理器GRUB
- css table设置边框_table布局的一些总结
- android使用greedao踩坑日记
- matlab怎么对图片mesh,MATLAB提供了mesh函数和surf函数来绘制三维曲面图。
- 异常错误 - MySQL导入时错误
- HSRP热备份路由协议配置详解
- Java常用中间件---SpringBoot整合ActivityMQ
- linux怎么卸载vsftpd软件,vsftpd配置详解之软件安装和卸载
- 操作系统--虚拟内存
- 鸿蒙系统,鸿蒙app简易登录界面,界面开发教程
- 《PyCharm2019安装教程》
- QT全自动检测,挂载U盘
- 计算机文化基础形考作业,(精华版)国家开放大学电大专科《计算机文化基础》网络课形考任务6作业及答案(2页)-原创力文档...
- zblog插件-zblog搜狗推送插件
热门文章
- SpringBoot整合腾讯云直播,生成推拉流配置及工具类详细讲解!
- Java——通过Java代码从ftp服务器下载文件
- idea 设置全局豆沙绿
- office 2010 激活 toolkit.exe 应用程序正常初始化失败
- 关于模板函数声明与定义的问题
- 计算机桌面声音图标,win7桌面右下角的小喇叭音量图标不见了怎么办?
- Excel文件编辑保护如何取消?
- You Only Watch Once(YOWO)
- 【笔记】2022.06.20 python数据分析三大神器numpy、pandas、matplotlib
- mysql监听显示syn_sent,TCP协议端口状态说明:CLOSE-WAIT、TIME-WAIT 、LISTENING、SYN_SENT、ESTABLISHED、LAST-ACK ......