Как указано в ответе, мяч извлекается из его центра и корректирует левые и верхние тесты, чтобы учесть это, это почти остановит мяч от входа в стену. Но это просто удача, что мяч отскакивает от стены, не вдаваясь. Если вы измените ширину холста на 799 и посмотрите на отскок правого края, вы увидите проблему, мяч войдет в стену 4 пикселя.
Вы перемещаете шарик 5 пикселей в направлении x, а затем проверяете его на стене
ballX += ballSpeedX;
if(ballX >= width - 10){
ballSpeedX = -ballSpeedX;
}
Если ширина = 100 и последняя позиция шара равна 89, вы добавляете 5, чтобы дать 94. Это приводит к тому, что ballSpeed ??будет отменено, но мяч все равно будет нарисован на 94 (4 пикселя до далекой)
Когда вы выполняете отскок, вам нужно позаботиться о времени между кадрами. Мяч редко попадает в стену в начале или конце кадра, но в какой-то момент во время кадра. За это время он, возможно, переместил много пикселей от стены.
Правильный способ сделать это - это работать, когда мяч попадает в стену, а затем удаляет ее от стены на правильную сумму. Это очень просто для линейного движения, так как расстояние до стены будет таким же, как расстояние, которое оно уйдет.
ballX += ballSpeedX;
if(ballX >= width - 10){
var dist = ballX - (width - 10); // how far into the wall
ballX = (width - 10) - dist; // the distance into the wall is the distance
// the ball has moved away from the wall
ballSpeedX = -ballSpeedX;
}
То же самое для левой стороны
if(ballX <= 10){
var dist = 10 - ballX; // how far into the wall
ballX = 10 + dist; // the distance into the wall is the distance
// the ball has moved away from the wall
ballSpeedX = -ballSpeedX;
}
И сделайте то же самое для верхней и нижней.