矩形包含点 returns false

Rectangle contains Point returns false

我正在 Visual studio 中使用 c# 制作一个简单的 Pacman 游戏。我决定制作一个主要角色可以在其中行走的矩形迷宫。我有一个覆盖主角边界的矩形:

Rectangle _pacmanBound = new Rectangle(Left, Top, 28, 28);

然后我取这个矩形的 4 个点(左上、左下、右上和右下)。 我还有一个包含吃豆子可以行走的矩形区域的列表:

map = new List<Rectangle>();

map.Add(new Rectangle(12, 375, 430, 28)); 
map.Add(new Rectangle(12, 403, 28, 97)); 
map.Add(new Rectangle(12, 470, 430, 28));

现在我想检查所有这 4 个点是否属于列表中的任何矩形(因此它表示该区域可步行):

foreach (Rectangle r in _maze.map)
{
    if (r.Contains(_pacmanBound.X, _pacmanBound.Y))
    {
        topLeft = true;

    }
    else if (r.Contains(_pacmanBound.X, _pacmanBound.Y + _pacmanBound.Height))
    {
        bottomLeft = true;    
    } 
    else if (r.Contains(_pacmanBound.X + _pacmanBound.Width, _pacmanBound.Y))
    {
        topRight= true;
    } 
    else if (r.Contains(_pacmanBound.X + _pacmanBound.Width, _pacmanBound.Y + _pacmanBound.Height))
    {
        bottomRight = true;
    }
}

循环后第一个是 true,第二个 - false,第三个 - false第四个 = false

为了让大家更好的理解,我附上这张图:

感谢任何帮助。

您的问题是您使用的是 else 子句。因此,如果第一个 if 子句为真,程序将不会检查其他 if 子句。您需要删除 else 子句:

foreach (Rectangle r in _maze.map)
{
            if (r.Contains(_pacmanBound.X, _pacmanBound.Y))
            {
                topLeft = true;

            }
            if (r.Contains(_pacmanBound.X, _pacmanBound.Y + _pacmanBound.Height))
            {
                bottomLeft = true;

            }
            if (r.Contains(_pacmanBound.X + _pacmanBound.Width, _pacmanBound.Y))
            {
                topRight= true;

            }
            if (r.Contains(_pacmanBound.X + _pacmanBound.Width, _pacmanBound.Y + _pacmanBound.Height))
            {
                bottomRight = true;
            }
}

此外,您不必检查 pacman 矩形的每个点。您可以检查地图矩形是否包含 pacman 矩形:

foreach (Rectangle r in _maze.map)
{
    if (r.Contains(_pacmanBound))
    {
        isPacmanInsideMaze = true;
        break;
    }
}