Два прямоугольника не пересекаются, когда я думаю, что они должны - PullRequest
1 голос
/ 18 марта 2020

У меня есть вражеский прямоугольник

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

У меня есть foreach l oop, циклически перебирающий список прямоугольников и метод, который проверяет, пересекались ли эти два прямоугольника, и возвращает логическое значение. .

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

1 Ответ

2 голосов
/ 18 марта 2020

Ваш testEnemy.isEnemyCurrentlyColliding = false; происходит сразу после установки testEnemy.isEnemyCurrentlyColliding = true;, без оператора else, поэтому он всегда будет установлен в false.

Я буду помнить, что это foreach l oop, так что даже если вы добавите оператор else, следующий элемент в списке снова заменит testEnemy.isEnemyCurrentlyColliding. Если вам нужно только проверить, приводит ли один из них к значению true, я рекомендую использовать break, что завершит текущий foreach l oop.

Так, например:

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

Оператор else не понадобится, если вы используете break, потому что это закончило бы foreach l oop прямо там, где он стоит.

...