Я создаю игру, используя 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 = ?;
}
}
После столкновения сущность должна быть перемещена из области предмета, в которую она попала, при этом сохраняя свою скорость и направление, и позволяя ей скользить по области. Это должно быть сделано другим вектором, чтобы отменить движение объекта к столкновению.