Java游戏中的碰撞检测? 12 月 Questions & Answers 5587 我正在开发一个游戏,在这个游戏中,我遇到了运动图像碰撞检测的问题。游戏中有一艘宇宙飞船和一些小行星(障碍物)。我想检测它们之间的碰撞。我该怎么做
# 1 楼答案 和盒子碰撞很容易。如果你只看x轴,两个盒子有三种可能的布局: 重叠 第一个盒子在第二个盒子的左边 第一个盒子在第二个盒子的右边李> 如果第一个长方体位于第二个长方体的左侧,这意味着其最右边的点必须位于第二个长方体最左边的点的左侧 first.right < second.left 如果第一个长方体位于第二个长方体的右侧,则其最左侧的点必须位于第二个长方体最右侧的点的右侧 first.left > second.right 如果两者都不正确,则框在x轴上重叠 然后,您可以在y平面上重复此操作(用左和右替换顶部和底部),以确定长方体是否也在y轴上重叠-如果重叠,则它们正在碰撞!这就是2d游戏中简单碰撞所需要做的 更大的问题可能会出现,这取决于你有多少不同的对象,因为碰撞检测的简单实现是一个O(N^2)算法
# 2 楼答案 可以使用Java内置的矩形交点。它甚至适用于旋转的矩形 创建矩形,确保它遵循对象的旋转和位置 每帧调用rectangle.intersects(Rectangle)方法,以确定它是否相交 使用多个矩形可以为形状怪异的图像创建更好的点击框
# 3 楼答案 检测两幅图像的X和Y,然后进行一些计算,如果它们的大小不同,则减去每个图像的宽度和高度,以获得正确的X和Y坐标。 例如: |------- | | | | | | |_______| ` | | | | comming down |---------| | | | | | | |---------| Minus width and height to find out correct x and y
# 4 楼答案 碰撞检测对于矩形以外的任何物体通常都很棘手 我过去的做法是为每个对象提供图像和遮罩。例如,像来自Lost in Space的木星2号宇宙飞船这样的物体会有以下图像和遮罩: X 00000100000 XXXXXXX 00111111100 X X 01111111110 X X 11111111111 X X 01111111110 XXXXXXX 00111111100 XXX 00001110000 图像会显示在屏幕上,而遮罩则用于碰撞检测。你会注意到遮罩中的1基本上是图像的轮廓和内容 检测碰撞的方式: 检查矩形是否重叠。否则,就不可能发生碰撞李> 否则,创建一个包含遮罩的1号对象矩形李> 构造另一个包含遮罩的对象2矩形李> 按位和矩形2与矩形1的重叠部分李> 如果矩形1中还有任何1位,则表示存在冲突李> 这将考虑到“未遂事件”,即每个对象的边界矩形重叠,但不一定是对象本身的轮廓。位运算符是检测这种情况的有效方法 下面是一个箭头没有击中气球的例子——在我的图形设计技能面前颤抖: ....xx.... ..xx..xx.. .x......x. .x......x. x........x x........x .x......x. .x......x. ..xx..xx.. ....xx.**y..... .y...... yyyyyyyy .y...... ..y..... 您可以看到,即使矩形重叠(请参见^{),箭头实际上并未与气球接触。通过对掩码应用按位AND操作,这些位最终将为零,从而导致无冲突 @kyoryu在他的评论中提出了一个有趣的观点。有些游戏很适合用较小的矩形组成对象,你可以简化基于矩形组件的碰撞检测(而不用担心像素的完美性)。例如,我们的老朋友太空入侵者(实际上是游戏中对抗太空入侵者的防御者)可能由两个矩形组成,X和Y,导弹由Z制成: YYYY .Z. YYYY .Z. XXXXXXXXXXXX .Z. XXXXXXXXXXXX ZZZ XXXXXXXXXXXX .Z. XXXXXXXXXXXX 这可以归结为对导弹与两个太空入侵者矩形的简单矩形检查——考虑到导弹的大小,你可能会称之为碰撞,即使你接触到.字符之一(考虑它们是近程导弹,而不是撞击类型的导弹)
# 5 楼答案 对于这样的简单游戏,我发现使用圆圈可以很容易地检测碰撞。我们可以利用Pythagorean Theorem for triangles c^2 = a^2 + b^2 我们可以通过知道,如果两个圆心之间的距离小于组合半径,那么它们一定会发生碰撞来检测两个圆之间的碰撞,对吗?然后可以执行如下碰撞检查: distX ^ 2 + distY ^ 2 <= (radius1 + radious2) ^ 2 == COLLISION! distX和distY是两个圆的中心之间的距离,可以预先计算半径1+半径2的平方,除非圆的大小发生变化 使用圆的一个好处是,计算对象如何相互反弹也比使用正方形或矩形容易得多
# 6 楼答案 如果你愿意的话,JBox2D是一个神奇的物理引擎,旨在帮助解决这个问题。它为你处理所有的物理问题,你所要做的就是在它告诉你的地方画图 我个人现在一直在使用它。我确实发现开始使用它有点困难,但一旦你开始记住如何制作一个物体,它就会变得非常容易 你可以下载它 还有一些关于基础知识的视频。他使用的图书馆有点“软弱无力”,但你很容易理解基本知识
# 1 楼答案
和盒子碰撞很容易。如果你只看x轴,两个盒子有三种可能的布局:
如果第一个长方体位于第二个长方体的左侧,这意味着其最右边的点必须位于第二个长方体最左边的点的左侧
如果第一个长方体位于第二个长方体的右侧,则其最左侧的点必须位于第二个长方体最右侧的点的右侧
如果两者都不正确,则框在x轴上重叠
然后,您可以在y平面上重复此操作(用左和右替换顶部和底部),以确定长方体是否也在y轴上重叠-如果重叠,则它们正在碰撞!这就是2d游戏中简单碰撞所需要做的
更大的问题可能会出现,这取决于你有多少不同的对象,因为碰撞检测的简单实现是一个O(N^2)算法
# 2 楼答案
可以使用Java内置的矩形交点。它甚至适用于旋转的矩形
创建矩形,确保它遵循对象的旋转和位置
每帧调用
rectangle.intersects(Rectangle)
方法,以确定它是否相交使用多个矩形可以为形状怪异的图像创建更好的点击框
# 3 楼答案
检测两幅图像的X和Y,然后进行一些计算,如果它们的大小不同,则减去每个图像的宽度和高度,以获得正确的X和Y坐标。 例如:
# 4 楼答案
碰撞检测对于矩形以外的任何物体通常都很棘手
我过去的做法是为每个对象提供图像和遮罩。例如,像来自Lost in Space的木星2号宇宙飞船这样的物体会有以下图像和遮罩:
图像会显示在屏幕上,而遮罩则用于碰撞检测。你会注意到遮罩中的1基本上是图像的轮廓和内容
检测碰撞的方式:
这将考虑到“未遂事件”,即每个对象的边界矩形重叠,但不一定是对象本身的轮廓。位运算符是检测这种情况的有效方法
下面是一个箭头没有击中气球的例子——在我的图形设计技能面前颤抖:
您可以看到,即使矩形重叠(请参见^{),箭头实际上并未与气球接触。通过对掩码应用按位AND操作,这些位最终将为零,从而导致无冲突
@kyoryu在他的评论中提出了一个有趣的观点。有些游戏很适合用较小的矩形组成对象,你可以简化基于矩形组件的碰撞检测(而不用担心像素的完美性)。例如,我们的老朋友太空入侵者(实际上是游戏中对抗太空入侵者的防御者)可能由两个矩形组成,X和Y,导弹由Z制成:
这可以归结为对导弹与两个太空入侵者矩形的简单矩形检查——考虑到导弹的大小,你可能会称之为碰撞,即使你接触到
.
字符之一(考虑它们是近程导弹,而不是撞击类型的导弹)# 5 楼答案
对于这样的简单游戏,我发现使用圆圈可以很容易地检测碰撞。我们可以利用Pythagorean Theorem for triangles
我们可以通过知道,如果两个圆心之间的距离小于组合半径,那么它们一定会发生碰撞来检测两个圆之间的碰撞,对吗?然后可以执行如下碰撞检查:
distX和distY是两个圆的中心之间的距离,可以预先计算半径1+半径2的平方,除非圆的大小发生变化
使用圆的一个好处是,计算对象如何相互反弹也比使用正方形或矩形容易得多
# 6 楼答案
如果你愿意的话,JBox2D是一个神奇的物理引擎,旨在帮助解决这个问题。它为你处理所有的物理问题,你所要做的就是在它告诉你的地方画图
我个人现在一直在使用它。我确实发现开始使用它有点困难,但一旦你开始记住如何制作一个物体,它就会变得非常容易
你可以下载它
还有一些关于基础知识的视频。他使用的图书馆有点“软弱无力”,但你很容易理解基本知识