Java 忽略透明部分图像的二维碰撞检测

Java 忽略透明部分图像的二维碰撞检测,java,2d,transparency,collision-detection,Java,2d,Transparency,Collision Detection,所以我决定查找一些碰撞检测,但我一直很难找到正确的信息 关于两幅图像之间的2d碰撞检测,包括如何正确避免检测到透明 图片的区域,但我确实找到了一个帖子,我把自己贴上去了,但问题是我没有 我真的很理解这篇文章,也不明白他为什么要做这些事情 以下是有问题的帖子: 因此,首先我想问这个解决方案是否真的是一个好的/合适的,或者我是否应该去别处看看 其次,我想知道,在他的帖子中,他提到使用整数数组,而不是2d数组来 设置1和0来决定像素是否透明,但我真的不知道该怎么做 为了实现这一点。起初,我认为它可以通

所以我决定查找一些碰撞检测,但我一直很难找到正确的信息 关于两幅图像之间的2d碰撞检测,包括如何正确避免检测到透明 图片的区域,但我确实找到了一个帖子,我把自己贴上去了,但问题是我没有 我真的很理解这篇文章,也不明白他为什么要做这些事情

以下是有问题的帖子:

因此,首先我想问这个解决方案是否真的是一个好的/合适的,或者我是否应该去别处看看

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

我也尝试了这一点,但运气不佳,因为代码不能与此数组一起工作:

 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;
    } 
}
long[]数组=新长[30*30];//图像的高度*宽度
int x=0;
int y=0;
对于(int i=0;i,(
&
)的结果对于两个操作数中对应位均为真的每一位为真(1),否则为假(0)

他使用的想法是创建一个图像版本(一个掩码),其中原始图像中的每个不透明像素存储为“1”位,每个透明像素存储为“0”位。这些被压缩为一个整数,可以通过一个and操作对另一个图像的掩码进行测试(在拍摄前,他计算两幅图像之间的水平距离,必要时移动其中一幅遮罩)

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

5, 0, 0, 5
      8, 8, 8, 8
虽然出于实用目的,我将它们放在单独的行中,但您应该将它们视为在同一行中,因此左图像的最后两个像素与右图像的前两个像素重叠

以二进制表示查看时,行的掩码为:

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

1001 << 2 => 100100
这些给了我们:

000100

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

除非您有非常具体的要求(例如,使用基本体无法轻松描述非常不规则的形状),否则使用碰撞几何体测试碰撞更快、更直接,更可能产生有用的结果。其次,我想知道,在他的帖子中,他提到使用整数数组,而不是2d数组。看起来“你可以使用一维数组来表示二维数据:int-arr[H][W]=>int-arr[HW],arr[y][x]=>arr[yW+x].什么是碰撞几何体?谷歌搜索不会给出太多信息!即使如此,我还是想理解代码。我试图填充一个数组[h*x]使用1和0,但在给定的代码中实现时,它不起作用。我真的很想理解代码,但我根本不理解他做这些事情的过程/动机,我试着弄明白,但没有运气!他所做的是用位掩码检查冲突。(谷歌应该会给出相关结果)。碰撞几何体实际上只是几何体-而不是思考“这两个图像是否碰撞”,而是思考“这些矩形/三角形/圆/它们的任何组合是否碰撞”。其优点是速度更快(例如,如果两个2D圆的距离小于其半径之和,则会发生碰撞)比使用位掩码,还产生类似“我必须对这个对象应用的最小偏移量是多少,这样它就不会再发生碰撞”这样的结果。
000100