Я хотел обнаружить столкновение, когда жест смахивания ударяет по объекту на холсте.
У меня есть два круга, 1 неподвижный, другой перемещается, когда события touchstart
и touchmove
запускаются при отслеживаниикоординаты x
и y
.
Для обнаружения столкновения я использую теорему Пифагора для вычисления расстояния между двумя окружностями:
function getDistance(circle1x, circle1y, circle2x, circle2y) {
let xDistance = circle1x - circle2x;
let yDistance = circle1y - circle2y;
return Math.sqrt((xDistance * xDistance) + (yDistance * yDistance));
}
Когда радиусы обеих окружностейдобавлено больше, чем расстояние, тогда должно быть столкновение:
if(getDistance(circle1.x, circle1.y, circle2.x, circle2.y) < circle1.radius + circle2.radius) {
// collision
}
Но это не всегда работает, особенно если радиусы обоих кругов малы (то, что я тестировал, составляет 25 пикселей и ниже, но это, вероятно, происходит навсе, что меньше 50% вашего экрана)Когда я регистрировал событие touchmove
, я заметил, что его координаты иногда не попадают в объект.Иногда, когда вы проводите слишком быстро, координаты просто перепрыгивают через объект.Я прочитал на w3.org , где написано:
Обратите внимание, что скорость, с которой пользовательский агент отправляет события touchmove, определяется реализацией и может зависеть от аппаратных возможностей и других реализаций.детали.
Так как же справиться с коллизией с помощью касания?