Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java游戏中的碰撞检测?_Java_Collision Detection - Fatal编程技术网

Java游戏中的碰撞检测?

Java游戏中的碰撞检测?,java,collision-detection,Java,Collision Detection,我正在开发一个游戏,在这个游戏中,我遇到了运动图像碰撞检测的问题。游戏中有一艘宇宙飞船和一些小行星(障碍物)。我想检测它们之间的碰撞。如何实现这一点?对于矩形以外的任何对象,碰撞检测通常都很棘手 我过去的做法是为每个对象提供图像和遮罩。例如,一个像来自的木星2号宇宙飞船这样的物体会有以下图像和遮罩: X 00000100000 XXXXXXX 00111111100 X X 01111111110 X

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

对于矩形以外的任何对象,碰撞检测通常都很棘手

我过去的做法是为每个对象提供图像和遮罩。例如,一个像来自的木星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.....
您可以看到,即使矩形重叠(请参见
**y
),箭头实际上并未与气球接触。通过对掩码应用按位AND操作,这些位将最终为零,从而导致无冲突


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

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

这可以归结为对导弹与两个空间入侵者矩形的简单矩形检查——考虑到导弹的大小,即使你接触到
字符之一,你也可能称之为碰撞(考虑它们是近程导弹,而不是撞击种类的导弹).

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

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

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

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

|------- | | | | | | |_______| ` | | | | comming down |---------| | | | | | | |---------| Minus width and height to find out correct x and y |------- | | | | | | |_______| ` | | | | 交付 |---------| | | | | | | |---------| 减去宽度和高度,找出正确的x和y
和盒子碰撞很容易。如果只看x轴,两个框有三种可能的排列方式:

  • 重叠
  • 第一个盒子在第二个盒子的左边
  • 第一个盒子在第二个盒子的右边
  • 如果第一个长方体位于第二个长方体的左侧,则表示其最右侧的点必须位于第二个长方体最左侧的点的左侧

    first.right < second.left
    
    first.left > second.right
    
    如果两者都不正确,则框在x轴上重叠

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


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

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

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

    你可以下载它


    还有一些关于基础知识的视频。他使用的库有点“松散”,但您可以轻松理解基本知识。

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

  • 创建矩形并确保它遵循对象的旋转和位置

  • 每一帧对其调用
    rectangle.intersects(rectangle)
    方法以确定其是否相交


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

    通常,对于这样的游戏,矩形就是您所需要的全部。大多数阿卡迪类型的游戏只使用矩形,事实上,使用的矩形不一定与它们所代表的东西大小相同(通常对玩家来说更小,而对敌人来说更大)。每像素精度几乎从来都不是必需的。这一点很好,@kyoryu,但即使是最简单的游戏也会有由多个矩形组成的对象(否则图形将非常糟糕)。这些规则仍然有效,只是检测构成对象的矩形之间的碰撞,而不是检测像素碰撞(逻辑结束位置)。所示的球体示例不适合矩形,因为矩形具有弯曲的性质。通常精灵的渲染和碰撞不会以1:1的比例映射。当渲染任意细节的精灵时,在大多数2d游戏中,会使用collis
    first.left > second.right