Rectangle包含Point返回false

时间:2016-10-23 22:40:59

标签: c# .net visual-studio point rectangles

我在Visual Studio中使用c#制作简单的Pacman游戏。我决定制作一个迷宫的长方形,主角可以走路。我有一个覆盖主角边界的矩形:

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

然后我取这个矩形的4个点(左上角,左下角,右上角和右下角)。 我还有一个包含pacman可以走的矩形区域的List:

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

为了让您更好地理解,我添加了这张图片: http://i.imgur.com/hvLKNOy.png

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您的问题是您正在使用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;
    }
}