Прямоугольник содержит проблему - PullRequest
3 голосов
/ 16 апреля 2011

Я строю игру космического захватчика и использую этот метод linq, чтобы увидеть, был ли игрок поражен захватчиками:

foreach (var playerShot in playerShots)
{
    if (isWeapon)
    {
        AliensHit = from invader2 in invaders
                    where invader2.Area.Contains(playerShot.Area)
                    select invader2;
    }
}

позже у меня есть алгоритм, который удаляет выстрел и захватчик, ноэто не имеет значения, так как метод содержимого не работает.Я делаю снимок, который является растровым изображением, и он проходит через захватчик (его свойство Area изменяется правильно, я проверил с помощью отладчика, и так изменилась область захватчиков: они оба перемещаются).Затем я проверил с помощью меньшего прямоугольного выстрела, находится ли прямоугольный снимок в области захватчиков, и это сработало.Оба были удалены.

AliensHit = from invader in invaders
            where invader.Area.Contains(playerShot.Location)
            select invader;

Почему, когда я помещаю область, чтобы проверить, что метод не работает, я проверил отладчик в течение 3 часов и не нашел ничего плохого.(

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Проблема звучит как использование Contains.Это вернет true тогда и только тогда, когда прямоугольник выстрела полностью находится внутри прямоугольника захватчика.С меньшим playerShot это будет происходить чаще.

Вы, вероятно, захотите использовать .Intersect(playerShot.Area) вместо этого - это вернет true, если две области перекрываются вообще.

Редактировать: Как отмеченоОП, .IntersectsWith(playerShot.Area) - это метод, который я имел в виду!

1 голос
/ 16 апреля 2011

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

Один из способов решить эту проблему - значительно увеличить физический FPS., но рисует только каждый 1 кадр в 10 физических кадрах.

Другим (возможно, лучшим) способом было бы увидеть, пересекается ли линия (oldShotX, oldShotY) -> (newShotX, newShotY)прямоугольник захватчика.Но гораздо проще просто запустить FPS.

...