C# 二维碰撞检测系统在对角移动到拐角处时没有反应

C# 二维碰撞检测系统在对角移动到拐角处时没有反应,c#,xna,collision-detection,C#,Xna,Collision Detection,因此,我的碰撞检测系统被设置为检查角色的每个像素,标记collisionDetected,将违规角色模型的像素放入collisionDetectedX和collisionDetectedY。它使用此数据确定有效的可移动区域的位置,并将装置推回到其中。解决这个问题的唯一方法是让X和Y的碰撞类同时运行,还是我可以修改这个类以正确地同时执行这两个作业?谢谢你抽出时间,我一直在发疯,想弄清楚我做错了什么。我为粗心的代码道歉。我把它清理了一点,真是一团糟,但我意识到它不值得最终产品 class Colli

因此,我的碰撞检测系统被设置为检查角色的每个像素,标记collisionDetected,将违规角色模型的像素放入collisionDetectedX和collisionDetectedY。它使用此数据确定有效的可移动区域的位置,并将装置推回到其中。解决这个问题的唯一方法是让X和Y的碰撞类同时运行,还是我可以修改这个类以正确地同时执行这两个作业?谢谢你抽出时间,我一直在发疯,想弄清楚我做错了什么。我为粗心的代码道歉。我把它清理了一点,真是一团糟,但我意识到它不值得最终产品

class Collision
{        
    public Color[,] DataMiner(Texture2D background)
    {
        Color[,] collision2D;
        Color[] collision1D;
        collision1D = new Color[background.Width * background.Height];
        background.GetData(collision1D);
        collision2D = new Color[background.Width, background.Height];
        for (int x = 0; x < background.Width; x++)
            for (int y = 0; y < background.Height; y++)
                collision2D[x, y] = collision1D[x + y * background.Width];
        return collision2D;
    }
    public void CollisionChecker(Color[,] background, ref Vector2 position)
    {
        Rectangle character;
        character.Width = 32;
        character.Height = 32;
        character.X = Convert.ToInt16(position.X);
        character.Y = Convert.ToInt16(position.Y);
        int n = 0;
        int n2 = 0;
        bool collisionDetected = false;
        int collisionDetectedX = 0;
        int collisionDetectedY = 0;
        while (n2 < character.Width)
        {
            n = 0;
            while (n < character.Height)
            {
                if (background[character.X + n2, character.Y + n] == Color.Black)
                {
                    collisionDetected = true;
                    collisionDetectedX = n2;
                    collisionDetectedY = n;
                }
                n++;
            }
            n2++;
        }
        if (collisionDetected == true)
        {
            collisionDetectedX += Convert.ToInt16(position.X);
            collisionDetectedY += Convert.ToInt16(position.Y);
            if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red)
                position.Y += 1;
            else if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red)
                position.Y -= 1;
            else if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red)
                position.X += 1;
            else if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red)
                position.X -= 1;
            else if (background[collisionDetectedX - 2, collisionDetectedY - 2] == Color.Red)
            {
                position.X -= 1;
                position.Y -= 1;
            }
            else if (background[collisionDetectedX - 2, collisionDetectedY + 2] == Color.Red)
            {
                position.X -= 1;
                position.Y += 1;
            }
            else if (background[collisionDetectedX + 2, collisionDetectedY - 2] == Color.Red)
            {
                position.X += 1;
                position.Y -= 1;
            }
            else if (background[collisionDetectedX + 2, collisionDetectedY + 2] == Color.Red)
            {
                position.X += 1;
                position.Y += 1;
            }
            collisionDetected = false;
        }

    }
    public void Update(Texture2D background, ref Vector2 position)
    {
        CollisionChecker(DataMiner(background), ref position);
    }


}

}

在原文中回答了我的问题。

也许这会有帮助:
        if (collisionDetected == true)
        {
            collisionDetectedX += Convert.ToInt16(position.X);
            collisionDetectedY += Convert.ToInt16(position.Y);
            if (background[collisionDetectedX, collisionDetectedY + 2] == Color.Red && collisionDetected)
            {
                position.Y += 1;
                collisionDetected = false;
            }
            if (background[collisionDetectedX, collisionDetectedY - 2] == Color.Red && collisionDetected)
            {
                position.Y -= 1;
                collisionDetected = false;
            }
            if (background[collisionDetectedX + 2, collisionDetectedY] == Color.Red && collisionDetected)
            {
                position.X += 1;
                collisionDetected = false;
            }
            if (background[collisionDetectedX - 2, collisionDetectedY] == Color.Red && collisionDetected)
            {
                position.X -= 1;
                collisionDetected = false;
            }