簡體   English   中英

2D碰撞檢測系統在對角移動到角落時沒有反應

[英]2D Collision detection system not reacting while moving diagonally to corners

因此,我的碰撞檢測系統被設置為檢查角色的每個像素,標記flagsDenseDetected,將有問題的角色模型的像素放入collisionDetectedX和collisionDetectedY。 它使用此數據來確定有效可移動區域在哪里,然后將單元輕推回去。 唯一的解決方法是同時運行X和Y的Collision類,還是可以修改此類以同時正確地完成兩個工作? 謝謝您的寶貴時間,我一直在努力找出我做錯了什么。 我為松散的代碼表示歉意。 我整理了一下(確實是一團糟),但是我意識到這不是值得的最終產品。

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);
    }


}

嗯,我還沒有10名代表,所以我無法回答自己的問題,但是我發現了:

我稍微改變了if語句的條件。 我必須刪除else,因為當發現需要更改的嵌套if時,它將丟棄其余的if。 由於它一次完成所有操作,因此解決此問題后,如果它靠近拐角處,則在碰到平坦的牆壁時它將“向右”或“向左”滑動。 我添加了條件,以檢查collisionDetected是否仍然為true,並將每個更改都還原為false。

祝您有美好的一天,希望有人可以從我的錯誤中學到東西!

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

}

用原文回答了我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM