Вероятно, это
ball.xspeed = Math.random()*8-4;
ball.yspeed = Math.random()*8-4;
Они генерируют xspeed и yspeeds с плавающей запятой.Округленные / float / ceil значения, которые используются для рисования на экране.Я думаю, что когда процедура обнаружения столкновений запускается и проверяет наличие столкновений, она не может найти таковую, когда шарики находятся на очень небольшом расстоянии друг от друга в расчете, но когда скорость намного выше, следующий шаг вытолкнет шарики в их границы.Как только они окажутся внутри друг друга, function manage_bounce(ball, ball2)
будет вызываться при каждом увеличении, и будет пытаться отрегулировать направление отскока, но только для того, чтобы найти другое столкновение.
Я думаю, что основная проблема заключается в большом приращении в скоординированномиз-за большого значения скорости, но небольшого расстояния между двумя шарами, которые толкают их друг в друга, это режим, а не вычисления с плавающей запятой.
Во время вычисления, когда вы обнаружили столкновение, вы должны убедиться в этой точкечто они не находятся внутри друг друга, и если да, то уберите их и измените положение.ИЛИ вы можете рассмотреть приращение скорости, ЕСЛИ два шарика находятся на расстоянии больше пикселей от добавленного расстояния, ИЛИ что-то вроде этого
if the balls are `dn` pixels apart
if the speed in direction `n` is `n_speed`
then
if `dn` < `n_speed`
`n = n + dn`
else
`n = n + n_speed`
endif
endif
endif