有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java游戏中的碰撞检测?

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


共 (6) 个答案

  1. # 1 楼答案

    和盒子碰撞很容易。如果你只看x轴,两个盒子有三种可能的布局:

    1. 重叠
    2. 第一个盒子在第二个盒子的左边
    3. 第一个盒子在第二个盒子的右边

    如果第一个长方体位于第二个长方体的左侧,这意味着其最右边的点必须位于第二个长方体最左边的点的左侧

    first.right < second.left
    

    如果第一个长方体位于第二个长方体的右侧,则其最左侧的点必须位于第二个长方体最右侧的点的右侧

    first.left > second.right
    

    如果两者都不正确,则框在x轴上重叠

    然后,您可以在y平面上重复此操作(用左和右替换顶部和底部),以确定长方体是否也在y轴上重叠-如果重叠,则它们正在碰撞!这就是2d游戏中简单碰撞所需要做的

    更大的问题可能会出现,这取决于你有多少不同的对象,因为碰撞检测的简单实现是一个O(N^2)算法

  2. # 2 楼答案

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

    1. 创建矩形,确保它遵循对象的旋转和位置

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

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

  3. # 3 楼答案

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

    |-------
    |   |
    |   |
    |   |
    |_______|
    
    `    |
        |
        |
        |
    comming down
    
    
    
          |---------|
          |     |
          |     |
          |     |
          |---------|
    Minus width and height to find out correct x and y
    
    
    
  4. # 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. # 5 楼答案

    对于这样的简单游戏,我发现使用圆圈可以很容易地检测碰撞。我们可以利用Pythagorean Theorem for triangles

    c^2 = a^2 + b^2
    

    我们可以通过知道,如果两个圆心之间的距离小于组合半径,那么它们一定会发生碰撞来检测两个圆之间的碰撞,对吗?然后可以执行如下碰撞检查:

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

    distX和distY是两个圆的中心之间的距离,可以预先计算半径1+半径2的平方,除非圆的大小发生变化

    使用圆的一个好处是,计算对象如何相互反弹也比使用正方形或矩形容易得多

  6. # 6 楼答案

    如果你愿意的话,JBox2D是一个神奇的物理引擎,旨在帮助解决这个问题。它为你处理所有的物理问题,你所要做的就是在它告诉你的地方画图

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

    你可以下载它

    还有一些关于基础知识的视频。他使用的图书馆有点“软弱无力”,但你很容易理解基本知识