Чуть переделал код
Столкновение стало абсолютно упругим. Но мяч под некоторыми углами довольно резко сменяет позицию.
Всё-таки костыльный вариант с циклом пересечения не самый удачный.
boolean collision(float Radius2, float X2, float Y2)
{
Circle ball = new Circle();
ball.radius = Radius / 2;
ball.x = rect.x + ball.radius;
ball.y = rect.y + ball.radius;
Circle obj = new Circle();
obj.radius = Radius2 / 2;
obj.x = X2 + obj.radius;
obj.y = Y2 + obj.radius;
if (ball.overlaps(obj)) {
while (ball.overlaps(obj)) {
double xDelta = (ball.x + ball.radius / 2 + rect.dx) - (obj.x + obj.radius / 2);
double YDelta = (ball.y + ball.radius / 2 + rect.dy) - (obj.y + obj.radius / 2);
rect.dx = (float) xDelta;
rect.dy = (float) YDelta;
ball.x+=rect.dx*Gdx.graphics.getDeltaTime();
ball.y+=rect.dy*Gdx.graphics.getDeltaTime();
}
rect.x=ball.x-ball.radius;
rect.y=ball.y-ball.radius;
return true;
} else return false;