Мой игрок столкновение не работает правильно - PullRequest
1 голос
/ 16 декабря 2011

Коллизия работает, но с этими линиями что-то не так, поскольку игрок просто стоит на месте в начальной позиции x10 y10

for (int i = 0; i < sprites.Length; i++)
            {
                if (player.Top > sprites[i].Top && player.Bottom < sprites[i].Top) //Checking for intersection at the top of the player
                {
                    player_Collision1 = true; //Found collision
                }

                else if (player.Bottom > sprites[i].Top && player.Bottom < sprites[i].Bottom) //Checking for intersection at the bottom of the player
                {
                    player_Collision2 = true; //Found collision
                }

                else if (player.Left > sprites[i].Right && player.Left < sprites[i].Left) //Checking for intersection at the left of the player
                {
                    player_Collision3 = true; //Found collision
                }

                else if (player.Right > sprites[i].Left && player.Right < sprites[i].Right)//Checking for intersection at the right of the player
                {
                    player_Collision4 = true; //Found collision
                }
            }

Я использую прямоугольник XNA, и игрок - это имя одного прямоугольника, а спрайты - это массив всех прямоугольников, с которыми игрок может столкнуться. Прямоугольник XNA позволяет вам получить кординаты сторон прямоугольника, как вы это делаете: игрок. топ игрок. снизу и т. д. и т. д.

1 Ответ

2 голосов
/ 16 декабря 2011

Логика действительно испорчена. Первое 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 () я забыл точное имя. Это должно быть очевидно.) Вы сможете увидеть, как они определяют направление столкновения игрока. Они используют его, чтобы увидеть, может ли игрок прыгнуть через платформу, но не провалиться сквозь нее.

...