Java游戏中的碰撞检测?

时间:2010-03-15 04:56:17

标签: java collision-detection

我正在开发一种游戏,其中我有运动图像的碰撞检测问题。游戏中有一个宇宙飞船和一些小行星(障碍物)。我想检测它们之间的碰撞。我怎么能这样做?

6 个答案:

答案 0 :(得分:14)

对于矩形以外的其他任何内容,碰撞检测通常都很棘手。

我过去这样做的方法是为每个对象提供图像和掩码。例如,像Lost in Space中的Jupiter 2太空船这样的物体将具有以下图像和掩模:

     X            00000100000
  XXXXXXX         00111111100
 X       X        01111111110
X         X       11111111111
 X       X        01111111110
  XXXXXXX         00111111100
    XXX           00001110000

图像是对屏幕的抨击,但掩码是用于碰撞检测的内容。您会注意到蒙版中的1基本上是图像的轮廓和内容。

检测碰撞的方式:

  • 检查矩形是否重叠。如果没有,就不会发生碰撞。
  • 否则,创建一个由其掩码组成的对象编号为1的矩形。
  • 构造另一个由其掩码组成的对象2的矩形。
  • 按位-AND矩形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.....

你可以看到,即使矩形重叠(见**y),箭头实际上也没有与气球接触。通过对掩码应用按位AND运算,这些位将最终为零,从而导致非冲突。


@kyoryu在他的评论中提出了一个有趣的观点。有些游戏很适合用较小的矩形组成对象,你可以根据矩形组件简化碰撞检测(不必担心像素完美)。例如,我们的老朋友太空入侵者(实际上后卫对抗该游戏中的太空入侵者)可能由两个矩形组成,X和Y,导弹由Z制成:

    YYYY                .Z.
    YYYY                .Z.
XXXXXXXXXXXX            .Z.
XXXXXXXXXXXX            ZZZ
XXXXXXXXXXXX            .Z.
XXXXXXXXXXXX

这将归结为对两个太空入侵者矩形的导弹的简单矩形检查 - 考虑到导弹的大小,即使你联系其中一个.字符,你也可能将其称为碰撞(将它们视为近距离导弹而不是影响变种导弹。

答案 1 :(得分:1)

对于像这样的简单游戏,我发现使用圆圈可以非常轻松地检测碰撞。我们可以使用Pythagorean Theorem for triangles

c^2 = a^2 + b^2

我们可以通过知道如果中心之间的距离小于它们必须碰撞的组合半径来检测两个圆之间的碰撞,对吧?然后你可以像这样进行碰撞检查:

distX ^ 2 + distY ^ 2 <= (radius1 + radious2) ^ 2 == COLLISION!

distX和distY是两个圆心之间的距离,除非圆的大小在变化,否则可以预先计算radius1 + radius2的平方。

使用圆圈的一个好处是计算物体彼此反弹的方式也比使用方形或矩形更容易。

答案 2 :(得分:1)

与盒子碰撞很容易。如果你只看x轴,就有两种方法可以安排两个方框:

  1. 重叠
  2. 第一个框位于第二个框的左侧
  3. 第一个框位于第二个框的右侧。
  4. 如果第一个框位于第二个框的左侧,则表示其最右边的点必须位于第二个框最左边的点的左侧。

    first.right < second.left
    

    如果第一个框位于第二个框的右侧,则其最左边的点必须位于第二个框最右边的点的右边。

    first.left > second.right
    

    如果这两个都不成立,则框在x轴上重叠。

    然后你可以为y平面重复此操作(替换左右顶部和底部),以确定框是否也在y轴上重叠 - 如果它们相同,它们会发生碰撞!这就是你在2D游戏中为简单碰撞所需要做的所有事情。

    可能会出现更大的问题,具体取决于您拥有多少个不同的对象,因为碰撞检测的天真实现是O(N ^ 2)算法。

答案 3 :(得分:0)

检测两个图像的X和Y,然后进行一些计算减去每个图像的宽度和高度(如果它们的大小不同)以获得正确的x和y坐标。 例如:

|-------
|   |
|   |
|   |
|_______|

`    |
    |
    |
    |
comming down



      |---------|
      |     |
      |     |
      |     |
      |---------|
Minus width and height to find out correct x and y


答案 4 :(得分:0)

如果您愿意这样做,JBox2D是一个令人惊叹的物理引擎,旨在帮助解决这个问题。它为您处理所有物理,您所要做的就是在它告诉您的地方绘制图像。

我个人现在一直在使用它。我确实觉得开始使用起来有点困难但是一旦你开始记住如何制作一个物体,就会变得非常容易。

您可以下载here

还有一些关于基础知识的视频here。他使用的图书馆有一点点&#34;多愁善感的&#34;但你可以很容易地理解基础知识。

答案 5 :(得分:0)

您可以使用Java的内置矩形交叉点。它甚至适用于旋转的矩形。

  1. 创建矩形并确保它跟随对象的旋转和位置。

  2. 每帧调用rectangle.intersects(Rectangle)方法,以确定它是否相交。

  3. 使用多个矩形可以为奇形怪状的图像创建更好的点击框。