对于一个项目,我们得到了一个游戏引擎来创建游戏。作为其中的一部分,我们必须在通过边界框检测方法发现可能的碰撞后实施像素级碰撞检测。我已经实现了这两个,但我的像素级测试对于小物体(在这种情况下是子弹)失败了。我已经检查过它是否适用于慢速子弹,但也失败了。
对于我的像素级实现,我使用可用的 IntBuffer(也可以使用 ByteBuffer?)为每个纹理创建位掩码。IntBuffer 是 RGBA 格式,它的大小是宽度*高度,我将它放在一个 2D 数组中,并将所有非零数字替换为 1 以创建掩码。在边界框发生碰撞后,我找到了由重叠表示的矩形(使用 .createIntersection),然后使用按位与检查该交叉点内的两个精灵的贴图是否有非零像素。
这是我的像素级测试代码:
/**
* Pixel level test
*
* @param rect the rectangle representing the intersection of the bounding
* boxes
* @param index1 the index at which the first objects texture is stored
* @param index the index at which the second objects texture is stored
*/
public static boolean isBitCollision(Rectangle2D rect, int index1, int index2)
{
int height = (int) rect.getHeight();
int width = (int) rect.getWidth();
long mask1 = 0;
long mask2 = 0;
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
mask1 = mask1 + bitmaskArr[index1].bitmask[i][j];//add up the current column of "pixels"
mask2 = mask2 + bitmaskArr[index2].bitmask[i][j];
if (((mask1) & (mask2)) != 0)//bitwise and, if both are nonzero there is a collsion
{
return true;
}
mask1 = 0;
mask2 = 0;
}
}
return false;
}
我已经为此苦苦挣扎了好几天,任何帮助将不胜感激。