当前位置: 首页 > 知识库问答 >
问题:

像素级碰撞检测对小物体失败。(Java)

满玉泽
2023-03-14

对于一个项目,我们得到了一个游戏引擎,用来创建一个游戏。作为其中的一部分,我们必须在通过边界盒检测方法发现可能的冲突后实现像素级的冲突检测。我已经实现了这两个,但是我的像素级测试对于小对象(在本例中是项目符号)失败了。我已经检查过它是否适用于慢速子弹,但它也失败了。

对于我的像素级实现,我使用可用的IntBuffer为每个纹理创建位掩码(ByteBuffer也可用?)。IntBuffer是RGBA格式的,它的大小是width*height。我将它放在一个2D数组中,并用1替换所有的非零数字来创建掩码。在边界框的冲突之后,我找到重叠表示的矩形(使用.createintersection),然后使用bitwise和检查该交集内的两个sprite的映射,以获得非零像素。

下面是我的像素级测试代码:

/**
 * 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;
}

这几天来我一直在为这件事苦苦挣扎,任何帮助都将不胜感激。

共有1个答案

计寒
2023-03-14

我设法解决了我自己的问题,现在它正常运作。对于任何感兴趣的人,我所做的是找到由两个sprite的两个边界框的重叠创建的矩形。然后我把每一个物体连同它一起落到原点,相对来说,相交的矩形。需要注意的是,我将每个对象放置到一个“单独”的原点--即我实际上有两个相交的矩形--每个相交一个。每个相交矩形的坐标,现在在两个对象的位掩码2D数组的边界中,用来检查两个对象重叠的正确区域:

我通过位掩码从下到上,从左到右循环,作为上侧提供的图像数据--显然这是图像数据的标准。

 /**
 * My Pixel level test - 2D
 *
 * @param rect the rectangle representing the intersection of the bounding
 * boxes
 * @param index1 the index at which the first objects texture is stored
 * @param index2 the index at which the second objects texture is stored
 * @param p1 the position of object 1
 * @param p2 the position of object 2
 * @return true if there is a collision at a pixel level false if not
 */
//public static boolean isPixelCollision(Rectangle2D rect, Point2D.Float p1, Bitmask bm1, Point2D.Float p2, Bitmask bm2)
public static boolean isPixelCollision(Rectangle2D rect, Point2D.Float p1, int index1, Point2D.Float p2, int index2)
{
    int height = (int) rect.getHeight();
    int width = (int) rect.getWidth();

    byte mask1 = 0;
    byte mask2 = 0;

    //drop both objects to the origin and drop a rectangle of intersection for each along with them
    //this allows for us to have the co-ords of the rect on intersection within them at number that are inbounds.
    Point2D.Float origP1 = new Point2D.Float((float) Math.abs(rect.getX() - p1.x), (float) Math.abs(rect.getY() - p1.y));//rect for object one
    Point2D.Float origP2 = new Point2D.Float((float) Math.abs(rect.getX() - p2.x), (float) Math.abs(rect.getY() - p2.y));//rect for object two

    //to avoid casting with every iteration
    int start1y = (int) origP1.y;
    int start1x = (int) origP1.x;
    int start2y = (int) origP2.y;
    int start2x = (int) origP2.x;

    //we need to loop within the rect of intersection
    //goind bottom up and left to right
    for (int i = height - 1; i > 0; i--)
    {
        for (int j = 0; j < width; j++)
        {
            mask1 = bitmaskArr[index1].bitmask[start1y + i][start1x + j];
            mask2 = bitmaskArr[index2].bitmask[start2y + i][start2x + j];
            if ((mask1 & mask2) > 0)
            {
                return true;
            }
        }

    }
    //no collsion was found
    return false;
}
 类似资料:
  • 问题内容: 我主要专注于图形方面,以创建一些2DGame。我看过/看过几本教程,但是没有一部教程那么令人满意。我已经有一个玩家(一个正方形)在屏幕上移动并与其他正方形碰撞。重力等。 如果在屏幕上看到的对象太多(30 * 20),则一切正常。但是,如果我将其增加到300 * 300,则该程序开始运行非常慢,因为它必须检查许多对象。 我真的不知道Minecraft之类的游戏如何与ALL THOSE块一

  • 问题内容: 好的,我正在研究Android上的游戏。我需要实现像素完美碰撞检测。我已经在每个图像周围设置了边界框,每个边界框都进行了转换以匹配图像的当前旋转。一切都很好。我还将每个位图的像素数据存储在数组中。有人可以帮我找出检测像素是否重叠的最有效方法吗?在此先感谢您的帮助! 问题答案: 基本思想是为每个对象创建一个位掩码,您可以在每个像素中指示该对象是否实际存在。然后,比较两个对象的位掩码的每个

  • 问题内容: 问题: 我知道这个问题已经问了很多遍了,但是我没有找到任何好的答案。 所以我有一些游戏实体,现在检查碰撞的最佳方法是什么? 链接: 游戏(完成) 代码说明: 我有一个世界一流的实体列表: 我使用以下代码更新它们(仅在视图范围内): 所以现在我想检查实体更新方法中是否存在冲突。 我尝试将其作为更新方法: 这是当前的昆虫方法: 当前,相交方法始终返回true。但为什么? 问题答案: 实现此

  • 当我在中创建一个场景时,我经常需要两个节点在完全相同的或位置来创建一面墙。我添加了矩形物理体。它们都没有任何摩擦。 当我使一个spritendode在这些碰撞体上移动时(我对物理体使用冲量),它的行为就像在两个矩形之间有一个屏障,我需要“推”节点或使其跳过边界。正如我所说的,这些节点彼此完全一致,因此节点应该能够平滑地通过它们。 有什么建议吗? 如果你需要我正在使用的任何代码/图片,请询问。 编辑

  • 我试图在Cocos2d-x中移植像素完美冲突检测,原始版本是为Cocos2D制作的,可以在这里找到:http://www.cocos2d-iphone.org/forums/topic/pixel-perfect-collision-detection-using-color-blending/ 这是我的Cocos2d-x版本代码 如果我将“pp”参数发送为false,则我的代码工作正常。也就是说

  • 我需要在iPad精灵游戏中生成8个随机精灵对象。这些对象相当大,并且大小不同。它们不应该叠加。如果场景中生成的对象叠加,它将被删除(可选地,它会删除底层对象)。我一直在为Sprite Kit寻找一个像素完美的冲突检测框架或帮助类。到目前为止,我还没有找到教程或类似的东西。大多数人使用普通的冲突检测,这没有任何帮助,因为我的对象很大。我测试了标准方法,但它创建了矩形,使我的情况下的精灵区域更大。这是