当我认为它们应该相交时,两个矩形没有相交

Two rectangles are not intersecting when I think they should

我有一个敌人矩形

public void Update(GameTime gameTime)
{
  enemyRectangle = new Rectangle((int)enemyPosition.X, (int)enemyPosition.Y, enemyTexture.Width, enemyTexture.Height);
 ...

我有一个 foreach 循环,遍历一个矩形列表和一个检查这两个矩形是否相交的方法,这将 return 一个布尔值。

foreach (Bounds bounds in bounds.boundsList)
{
  if (bounds.EnemyWallIntersects(testEnemy.enemyRectangle, bounds.CurrentRectangle))
   {
     testEnemy.isEnemyCurrentlyColliding = true;
   }
   testEnemy.isEnemyCurrentlyColliding = false;
 }          

我确定这些矩形应该相交,但我不知道现在发生了什么。 我使用了一个断点,该矩形应该与到达它与敌人矩形具有相同 X 和 Y 的点相交。

这是"EnemyWallIntersects"方法。

 public bool EnemyWallIntersects(Rectangle rect1, Rectangle rect2)
 {
   if (rect1.Intersects(rect2))
   {
     return true;
   }
   else
     return false;
 }

你的 testEnemy.isEnemyCurrentlyColliding = false; 在设置 testEnemy.isEnemyCurrentlyColliding = true; 之后立即发生,没有 else 语句,所以它总是被设置为 false。

我会记住这是一个 foreach 循环,因此即使您放置了 else 语句,列表中的下一项也会再次覆盖 testEnemy.isEnemyCurrentlyColliding。如果您只需要检查其中一个结果是否为真,我建议使用 break,这将结束当前的 foreach 循环。

举个例子:

foreach (Bounds bounds in bounds.boundsList)
    {
        if (bounds.EnemyWallIntersects(testEnemy.enemyRectangle, bounds.CurrentRectangle))
        {
            testEnemy.isEnemyCurrentlyColliding = true;
            break;
        }
        testEnemy.isEnemyCurrentlyColliding = false;
    }         

如果您使用 break,则不需要 else 语句,因为这会在原处结束 foreach 循环。