Как определить, с какой стороны пересекаются два прямоугольника? - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь реализовать функцию, которая определяет, пересекаются ли два прямоугольника, то есть, если они «касаются», не используя функцию Rectangle.IntersectsWith. Причина этого в том, что я хочу определить, на какой стороне происходит столкновение относительно объекта «герой», но это не работает.

public bool[] Collisions(Rectangle hero, Rectangle rect)
{
    bool hitSomethingAbove = false;
    bool hitSomethingBelow = false;
    bool hitSomethingOnTheRight = false;
    bool hitSomethingOnTheLeft = false;

    if (hero.Left < rect.Right) // collision on left side
    {
       hitSomethingOnTheLeft = true;
    }
    if (hero.Right > rect.Left) // collision on right side
    {
       hitSomethingOnTheRight = true;
    }
    if (hero.Top < rect.Bottom) // collision on top
    {
       hitSomethingAbove = true;
    }
    if (hero.Bottom > rect.Top) // collision on bottom
    {
       hitSomethingBelow = true;
    }

    return new bool[] { hitSomethingAbove, hitSomethingBelow, 
        hitSomethingOnTheRight, hitSomethingOnTheLeft };
}

Ответы [ 2 ]

0 голосов
/ 11 июня 2019

Я бы предложил использовать Rectangle.Intersect метод:

public bool[] Collisions(Rectangle hero, Rectangle rect)
{
    var intersection = Rectangle.Intersect(hero, rect);
    if(intersection.IsEmpty){
        return new []{ false, false, false, false };
    }

    bool hitSomethingAbove = hero.Top == intersection.Top;
    bool hitSomethingBelow = hero.Bottom == intersection.Bottom;
    bool hitSomethingOnTheRight = hero.Right == intersection.Right;
    bool hitSomethingOnTheLeft = hero.Left == intersection.Left;

    return new bool[] 
    { 
        hitSomethingAbove, 
        hitSomethingBelow, 
        hitSomethingOnTheRight, 
        hitSomethingOnTheLeft, 
    };
}
0 голосов
/ 11 июня 2019

Проблема вашего кода в том, что все тесты предполагают, что герой уже находится в определенной позиции относительно другого прямоугольника. Например:

if (hero.Left < rect.Right) // collision on left side

Предполагается, что герой был уже справа от другого прямоугольника до этой проверки. Если герой уже находился слева от другого прямоугольника, ваш тест теперь утверждает, что произошло столкновение справа от прямоугольника (т. Е. Столкновение с левой стороны героя, согласно вашему комментарию к коду).

Так что ваша логика здесь нарушена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...