Думайте векторы.Если у вас две фигуры перекрываются, у вас есть вектор от центра одной к центру другой, например, так (это имеет смысл только после добавления их скоростей к их позициям, поскольку именно тогда они будут перекрываться):
var diff = {
x: next_shape.x - shape.x,
y: next_shape.y - shape.y
};
Это вектор от shape
до next_shape
.И у него есть меньшая величина (это короче), чем это должно быть для форм, чтобы остаться в стороне.Таким образом, чтобы найти количество, которое необходимо переместить фигурам
var diff_magnitude = Math.sqrt(diff.x*diff.x + diff.y*diff.y);
var overlap = (req_distance - diff_magnitude) / 2; // each shape needs to move this distance
Теперь масштабируйте вектор diff
, чтобы соответствовать расстоянию / величине
diff.x = overlap * diff.x / diff_magnitude;
diff.y = overlap * diff.y / diff_magnitude;
Наконец, переместите одну фигуру в однунаправление, а другая фигура - в противоположном направлении
shape.x -= diff.x;
shape.y -= diff.y;
next_shape.x += diff.x;
next_shape.y += diff.y;
Теперь две фигуры должны быть направлены друг против друга.
Вы также захотите установить их скорости вположительное / отрицательное направление diff
, поэтому они продолжают движение по этой траектории после столкновения, если действительно сохраняют свои скорости.
Обратите внимание, что это на самом деле не "отскакивает" формы друг от друга, а толькоудаляет их достаточно, чтобы устранить перекрытие, которое существует после того, как они начали перекрываться.Так что это довольно упрощенно.Но существует множество источников, которые дадут вам более точные методы обнаружения столкновений и реагирования на них.