На первый взгляд похоже, что ваша проблема здесь:
(b.getX() == brick.getX() || b.getX() == brick.getX() + brick.getLength())
Если x увеличивается на (например) 5 на каждый тик, то вы можете перейти с b.getX() < brick.getX()
на b.getX() > brick.getX()
, не выполняя условия равенства. Поэтому, когда мяч попадает в кирпич, он не справляется с этим условием и переходит к следующему:
else
b.setDy(-b.getDy());
Таким образом, он меняет вертикальное направление, когда вы хотите повернуть его горизонтально (и, возможно, также вертикально).
В качестве дополнительного примечания вы можете захотеть использовать {} фигурные скобки в однострочных операторах if, даже если они не являются строго необходимыми. Они помогут вашему коду выглядеть чище и избежать ошибок при последующих изменениях.