У меня есть анимация с использованием JS и Fabric.js, в результате чего вокруг экрана больше кругов. Я пытаюсь сдержать их в определенной области, но у меня есть некоторые проблемы.
После некоторого чтения вчера я подумал, что проверить, находится ли круг внутри прямоугольника (их контейнера), будет довольно просто, но мне еще предстоит заставить его работать должным образом.
Круги создаются внизу экрана, где также находится их контейнер. С кодом, который у меня есть, они «плавают» наверху и остаются там на одном месте.
Журналы консоли, которые у меня есть, показывают, что они сразу же находятся за пределами прямоугольника, поэтому я предполагаю, что что-то не так с моей функцией столкновения.
Моя цель состоит в том, чтобы они оставались внутри сдерживающего элемента, двигаясь, и когда они ударяются о края, они должны менять направление, чтобы снова оставаться внутри.
Спасибо за любую помощь.
РЕДАКТИРОВАТЬ: ОТРЕДАКТИРОВАНО, ЧТОБЫ ВКЛЮЧИТЬ ПРИКОСНУЮ ЯСНОСТЬ И ИСПОЛЬЗОВАТЬ ОБНАРУЖЕНИЕ COLSIOSN ИЗ НИЖЕ ОТВЕТА, ТАК КАК СЕЙЧАС ДУМАЮТ, ЧТО ПРОБЛЕМА С ОТВЕТОМ ВМЕСТО ОБНАРУЖЕНИЯ.
Функция столкновения:
функция testCollision (круг, прямоугольник) {
return circle.left + circle.radius < rectangle.left + rectangle.width/2 //right side
&& circle.left - circle.radius < rectangle.left - rectangle.width/2 //left side
&& circle.top + circle.radius < rectangle.top + rectangle.height/2 //top
&& circle.top - circle.radius < rectangle.top - rectangle.height/2;
}
слева = х и вверху = у
Существуют значения maxX и maxY, которые представляют собой ширину и высоту контейнера.
это тест:
if(testCollision(circle, rect) == false){
var r = Math.atan2(y - maxY / 2, x - maxX / 2);
vx = -Math.cos(r);
vy = -Math.sin(r);
}
любая помощь очень ценится, спасибо!