Java: помогите определить столкновение между двумя прямоугольниками - PullRequest
1 голос
/ 09 апреля 2011

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

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

Детали Пакмана: x 17,0 y 16,0 Детали Inky: x 22,0 y 13,0 Столкновение после вызова intersects (): true Детали Pacman: x 18,0 y 16,0 Детали Inky: x23,0 y 13,0 Столкновение после вызова intersects (): true

У меня есть прямоугольники, настроенные следующим образом:

public Rectangle pacmanBounds(){
    return new Rectangle(pacRow, pacColumn, 22, 22);
}
public Rectangle ghostBounds(){
    return new Rectangle(ghostRow, ghostColumn, 22, 22);
}

Высота и ширина были жестко заданы для целей тестирования, ноэто фактический размер изображения.

Я проверяю наличие столкновений каждый раз, когда JPanel перекрашивается:

public boolean checkCollision(){
    Rectangle pacmanBounds = pacman.pacmanBounds();
    //currently commented out for testing
    /*if(pacmanBounds.intersects(inky.ghostBounds()) || pacmanBounds.intersects(blinky.ghostBounds())
            || pacmanBounds.intersects(pinky.ghostBounds()) || pacmanBounds.intersects(clyde.ghostBounds())){
        System.out.println("Oh no!");
        return true;
    }*/

    System.out.println("Pacman details: x " + pacmanBounds.getX() + " y " + pacmanBounds.getY() + " ");
    System.out.println("Inky details: x " + inky.ghostBounds().getX() + " y " + inky.ghostBounds().getY());
    System.out.println("Collision after calling intersects(): " + pacmanBounds.intersects(inky.ghostBounds()));
    return false;
}

На данный момент у меня практически не осталось идейо том, как решить эту проблему, так что любой совет, который вы, ребята, можете дать, будет принята с благодарностью!

1 Ответ

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

Предполагая, getX() и getY() возвращают точку верхней левой координаты прямоугольника, тогда это будут границы прямоугольников для каждого вызова:

Детали Пакмана: x17,0 y 16,0 Inky details: x 22,0 y 13,0 Столкновение после вызова intersects (): true

Прямоугольник Пакмана будет иметь свои верхние левые координаты плюс 22 в каждом направлении, давая вам прямоугольник с нижнимправый угол (39.0, 38.0), который наиболее определенно пересекается с углом Инки, если его верхний правый угол равен (22.0, 13.0), а нижний левый угол равен (44.0, 35.0)

Вот как это выглядит для меня.Вы подразумеваете, что 22.0 - это границы прямоугольников Пакмана и Инки в пикселях или в квадратах?Если эти предположения верны, то левый нижний угол Инки (22.0, 35.0) буквально расположен полностью внутри Пакмана, что, вероятно, не то, что вам нужно.Проблема может заключаться в нескольких вещах, и трудно сказать, что это может быть, не зная, увидев еще немного кода и не зная, что именно означают прямоугольники.: D

...