矩形包含点 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;
}
}
我正在 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;
}
}