C# - 每像素碰撞检测

时间:2018-01-13 04:04:16

标签: c# xna collision-detection

这是我的情况我正在制作2D迷宫游戏(XNA 4.0)。我已经发现,进行碰撞检测的最佳方法是使用逐像素检测。在互联网上搜索时,我发现人们解释或显示两个碰撞的代码(即鼠标和播放器,播放器和播放器,两个形状)。我想做的是让这个碰撞检测玩家是否与墙碰撞(背景是黑色但迷宫墙是白色的)。有人可以解释如何做到这一点或给出代码的某种起点。非常赞赏。

P.S。链接到网站或与我的问题有关的任何内容也会有所帮助

2 个答案:

答案 0 :(得分:1)

这种CPU密集型操作的最佳方法是首先检查hitbox碰撞,然后检查每像素碰撞。

此代码中的大多数都可以在这个有用的video中找到。

static bool IntersectsPixel(Rectangle hitbox1, Texture2D texture1, Rectangle hitbox2, Texture2D texture2)
{
    Color[] colorData1 = new Color[texture1.Width * texture1.Height];
    texture1.GetData(colorData1);
    Color[] colorData2 = new Color[texture2.Width * texture2.Height];
    texture2.GetData(colorData2);

    int top = Math.Max(hitbox1.Top, hitbox2.Top);
    int bottom = Math.Min(hitbox1.Bottom, hitbox2.Bottom);
    int right = Math.Max(hitbox1.Right, hitbox2.Right);
    int left = Math.Min(hitbox1.Left, hitbox2.Left);

    for(y = top; y< bottom; y++)
    {
        for(x = left; x < right; x++)
        {
            Color color1 = colorData1[(x - hitbox1.Left) + (y - hitbox1.Top) * hitbox1.Width]
            Color color2 = colorData2[(x - hitbox2.Left) + (y - hitbox2.Top) * hitbox2.Width]

            if (color1.A != 0 && color2.A != 0)
                return true;
        }
    }
        return false;
}

您可以这样调用此方法:

if (IntersectsPixel(player.hitbox, player.texture, obstacle.hitbox, obstacle.texture))
{
    // Action that happens upon collision goes here
}

希望我能帮助你,
- GHC

答案 1 :(得分:0)

创建一个代表你的精灵的bool矩阵和一个代表你的迷宫的bool矩阵(代表你的精灵的矩阵需要与你的迷宫有相同的尺寸)。

那么你可以做一些简单的事情,比如迭代所有的x-y坐标并检查它们是否都是真的

// as an optimization, store a bounding box to minimize the 
// coordinates  of what you need to check
for(int i = 0; i < width, i++) {
    for(int j = 0; j < height, j++) {
        if(sprite[i][j] && maze[i][j]) {
             collision = true
             //you  might want to store the coordinates
        }
    }
}

如果您想要非常喜欢,可以展平您的迷宫矩阵并使用位操作