Ваша функция попадания неверна. Вы должны просто вычислить расстояние между двумя точками (что вы делаете правильно) и сравнить его с минимальным расстоянием между молотком и мячом.
Например,
return distance_squared < radii_squared
Вы фактически (эффективно) делаете:
return -COLLIDEDISTANCE < radii_squared - distance_squared && radii_squared - distance_squared < COLLIDEDISTANCE
Для которого требуется, чтобы любое попадание находилось в пределах 2 единиц от края, но числа, которые я видел, проходя через hit (), подразумевают, что у вас есть масштабный коэффициент, который делает единицу меньше одного пикселя.