Вы применяете логику «если мяч находится за пределами экрана, измените его скорость вдоль соответствующей оси», что неверно: возможно, мяч находится за пределами экрана, но уже движется в правильном направлении, Это происходит из-за того, что ваша скорость сильно зависит от отскоков (таких как гравитация или трение).
Первая часть решения заключается в явном указании направления:
if (ball.position.y < 0)
ball_speed.y = fabs(ball_speed.y);
if (ball.position.y > size.height)
ball_speed.y = - fabs(ball_speed.y);
Это будет гарантировать, что шар действительно вернется в экран, так что нет возможности колебания на краю.
Вторая часть, которая является необязательной, но, тем не менее, полезной, если вам нужна правильная физика, - это возвращать шарик обратно на экран всякий раз, когда он уходит:
if (ball.position.y < 0)
ball.position.y = 2 * 0 - ball.position.y ;
if (ball.position.y > size.height)
ball.position.y = 2 * size.height - ball.position.y;
Обратите внимание на pos = 2 * limit - pos
, который в основном отражает pos
вокруг limit
.