忽略透明部分的2D碰撞检测

时间:2012-08-04 20:47:58

标签: java 2d transparency collision-detection

所以我决定查找一些碰撞检测,但我一直无法找到适当的信息 关于两个图像之间的2d碰撞检测,包括如何正确地避免检测透明 图像的区域,但我找到了一个我自己附加的帖子,但问题是我没有 我真的理解这个帖子,也不明白为什么他会做这些事情......

以下是相关帖子:https://stackoverflow.com/posts/336615/revisions

首先,我想问一下这个解决方案是否真的是一个好的解决方案,或者我应该只看其他地方。

其次我想知道,在他的帖子中,他提到使用整数数组,而不是2d数组 设置1和0来决定像素是否透明,但我真的不知道我应该怎么做 为达到这个。起初我认为可以通过形成1和0的字符串并将其转换为Long来实现 但即使图像宽度只有25,Long也会......太长了......

我也没试过这个,因为代码不适用于这个数组:

 long[] array = new long[30*30]; // height * width of the image
    int x = 0;
    int y = 0;

for(int i = 0; i<30*30; i++){
    if(image.getRGB(x,y) == 0){
         array[i] = 0;
    }
    else{ array[i] = 1; }

    x++;
    if (x==30){
         y++;
         x=0;
    } 
}

第三,我希望有人可以解释整个过程以及为什么他所做的事情是必要的。 顺便说一句,我确实知道那些有点聪明的操作员是如何工作的! 换句话说,我不理解他在代码中做所有事情的思路/动机,我想了解这一切!

我现在真的不知道如何继续他......

1 个答案:

答案 0 :(得分:1)

对于每个位,bitwise AND operation&)的结果为真(1),其中两个操作数中相应位为真,否则为假(0)。

他正在使用的想法是创建一个图像版本(一个遮罩),其中原始图像中的每个非透明像素都存储为&#39; 1&#39;位,每个透明像素为&#39; 0&#39;位。这些被打包成一个整数,可以使用单个AND操作针对另一个图像对掩码进行测试(在AND之前,他计算两个图像之间的水平距离,并在必要时移动其中一个掩码)。

例如,我们假设我们有以下两个4x1像素图像:

5, 0, 0, 5
      8, 8, 8, 8

虽然我出于实际目的将它们放在不同的行上,但您应将它们视为位于同一行,因此左图像的最后两个像素与右图像的前两个像素重叠。

以二进制表示方式查看行的掩码为:

1001
1111

左右图像之间的距离为-2,因此我们将第一个掩模左移2位:

1001 << 2 => 100100

现在我们有了这些面具:

100100
001111

ANDing这些给了我们:

000100

非零结果告诉我们我们发生了碰撞。