Java游戏中的碰撞检测?

Che*_*tan 3 java collision-detection

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

pax*_*blo 14

对于除矩形之外的任何事物,碰撞检测通常都很棘手.

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

     X            00000100000
  XXXXXXX         00111111100
 X       X        01111111110
X         X       11111111111
 X       X        01111111110
  XXXXXXX         00111111100
    XXX           00001110000
Run Code Online (Sandbox Code Playgroud)

图像是什么获取blatted的屏幕,但面具是什么用于碰撞检测.您会注意到蒙版中的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.....
Run Code Online (Sandbox Code Playgroud)

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


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

    YYYY                .Z.
    YYYY                .Z.
XXXXXXXXXXXX            .Z.
XXXXXXXXXXXX            ZZZ
XXXXXXXXXXXX            .Z.
XXXXXXXXXXXX
Run Code Online (Sandbox Code Playgroud)

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