«Простое» обнаружение столкновений прямоугольников: почему мой код не работает? - PullRequest
2 голосов
/ 18 апреля 2011

Эй, ребята, пожалуйста, посмотрите на мой код и посмотрите, что здесь не так.Я посмотрел на документы и все, и кажется, что это должно работать.

public Boolean CollisionTest (Rect one, Rect two) {
        if (one.intersect(two)) {
            collided = true;
        } else {
            collided = false;
        }
        return(collided);
    }

Не должно ли это вернуться, если два прямоугольника сталкиваются?Причина, по которой я сомневаюсь в этом, заключается в том, что у меня возникли некоторые исключения с нулевым указателем внутри моего основного потока (он останавливается в моем операторе finally для моего потока игрового цикла) при отладке и когда я не использую эту функцию, это нормально.1005 * Очень странно, также я был бы признателен, если бы кто-нибудь мог опубликовать ссылки на полезные руководства по обнаружению столкновений.Я хочу иметь дело со своим собственным обнаружением коллизий и не использовать внешние библиотеки.

Спасибо ВСЕМ!

Ответы [ 4 ]

12 голосов
/ 18 апреля 2011

Согласно документации разработчиков Android для функции intersect:

Если указанный прямоугольник пересекает этот прямоугольник, верните true и установите для этого прямоугольника это пересечение , в противном случае верните false и не изменяйте этот прямоугольник.

Часть, на которую я акцентировал внимание, означает, что ваш параметр one может быть изменен, если прямоугольники пересекаются - я предполагаю, как он каким-то образом устанавливается на null, и в дальнейшем вызывает вашу ошибку в игровой цикл.

В документации также говорится:

Чтобы просто проверить пересечение, используйте intersects().

Описание метода Rect.intersects(Rect a, Rect b) доступно здесь .

Если мы изменим ваш метод для использования Rect.intersects, он будет выглядеть так:

public Boolean CollisionTest (Rect one, Rect two) {
        return Rect.intersects(one, two);
    }

В этот момент вы, вероятно, могли бы полностью избавиться от CollisionTest и просто позвонить Rect.intersects напрямую - если в какой-то момент вы не захотели реализовать собственное обнаружение столкновений. В этом случае вам просто нужно изменить этот метод. Это зависит от вас, на самом деле.

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

Ну, я не знаком с Rect API, но @Donut хорошо ответил на эту часть. Поскольку вам также интересно узнать об обнаружении столкновений, я оставлю два очень хороших урока по этому поводу.

У меня есть опыт создания системы карт листов и базового обнаружения столкновений для игры на Java (на телефоне Android). Это и , это были очень хорошими уроками и довольно простыми, и они содержат базовое обнаружение столкновений.

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

Я вижу, что вы не определили столкновение здесь в функции. Это определено в глобальном пространстве или как переменная экземпляра.

Также вы можете сократить свой код

public Boolean CollisionTest (Rect one, Rect two) {
    if (one.intersect(two)) {
        collided = true;
    } else {
        collided = false;
    }
    return(collided);
}

в

return one.intersect(two);
1 голос
/ 18 апреля 2011

Вы можете написать чек следующим образом:

public boolean CollisionTest(Rect one, Rect two) {
  return one.left <= two.right && one.right >= two.left &&
      one.top <= two.bottom && one.bottom >= two.top;
}
...