Как сделать обнаружение столкновений, используя области в java.awt.geom.Area? - PullRequest
1 голос
/ 04 апреля 2019

Я создаю игру, используя java.awt, и мне было интересно, как сделать расширенное обнаружение столкновений с Area s. В моей игре у каждого существа есть коллайдер с Area. Под расширенным обнаружением коллизий я имею в виду, что я не хочу, чтобы коллизия между двумя областями приводила к остановке сущности, скорее я хочу, чтобы коллизия приводила к скольжению сущности. Объекты имеют double значения величины и направления и площадь их формы столкновения. Формы столкновения должны быть любой формы (не только прямоугольники или круги). Выходные данные программы должны быть вектором, который при объединении с объектом может привести к тому, что этот объект не столкнется.

// Basic collision without sliding
public static boolean testCollsion(Area a, Area b) {
        Area c = (Area) a.clone();
        c.intersect(b);
        return !c.isEmpty();
}
// Advanced sliding collision
// Where b is stationary and a should change
public static void collide(Collidable a, Collidable b) {
    Area areaA = new Area(a.getCollider().shape);
    Area areaB = new Area(b.getCollider().shape);
    Area c = (Area) areaA.clone();
    c.intersect(areaB);
    if (!c.isEmpty()) {
        double directionA = a.getDirection();
        double directionB = b.getDirection();
        double magnitudeA = a.getMagnitude();
        double magnitudeB = b.getMagnitude();
        // Calculate collision vector
        double directionC = ?;
        double magnitudeC = ?;
    }
}

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

...