Логика действительно испорчена. Первое if
никогда не будет истинным, так как player.top не может быть ниже sprite.top И player.bottom выше sprite.top. Я думаю, что вы имели в виду, если (player.Top > sprites[i].Top && player.Bottom < sprites[i].Bottom)
Даже если он не столкнется, он все равно будет иметь значение true. Посмотрите на эту картину, почему. Вам также необходимо проверить ось X, чтобы определить правильное столкновение.
Другие if
имеют ту же проблему, что и первая. И при сравнении bottom / top и top / bottom и возвращении true, когда нет столкновения. При этом, если вы пытаетесь создать сценарий «прямой видимости» для бедняков, в котором вы просто хотите увидеть, стоит ли игрок в месте, которое спрайт может «увидеть», я ошибаюсь.
Я предлагаю взглянуть на стартовый набор платформеров , представленный на сайте App Hub, а также некоторые документы на нем. В частности, посмотрите на обнаружение столкновений (в Player.cs CheckCollision () ... или HandleCollision () я забыл точное имя. Это должно быть очевидно.) Вы сможете увидеть, как они определяют направление столкновения игрока. Они используют его, чтобы увидеть, может ли игрок прыгнуть через платформу, но не провалиться сквозь нее.