Существует как минимум две стратегии, которые вы можете использовать для столкновений: коррекция или предотвращение.
Коррекция означает, что вы перемещаете персонажа, а затем проверяете, сталкивается ли он, и если да, вы применяете коррекцию. Это означает, что вы находите позицию, в которой должен находиться игрок, и соответственно перемещаете ее. Это называется «реагирование на столкновение».
Предотвращение, с другой стороны, предполагает выполнение некоторой проверки перед перемещением, а затем перемещение игрока только до точки столкновения. Это потребует, например, некоторой техники радиопередачи.
В вашем случае вы, вероятно, захотите реализовать подход «исправления», учитывая, как организован ваш код.
У вас есть кусок кода, который проверяет, произошло ли столкновение (я Предположим, это работает). При обнаружении столкновения вы можете вызвать какой-нибудь метод для исправления положения.
private void collision() {
for (int i = 0; i < handler.object.size(); i++) {
GameObject tempObject = handler.object.get(i);
if(tempObject.getId() == ID.Block)
{
if(getBounds().intersects(tempObject.getBounds()))
{
//collision events
}
}
}
}
Есть интересный вопрос об обмене стеками gamedev, на котором вы можете посмотреть, как реализовать реакцию на столкновение: https://gamedev.stackexchange.com/questions/160248/2d-rectangle-collision-resolution
Я бы настоятельно рекомендовал использовать точные векторы вместо простых чисел для положения и скорости. Это делает все проще для понимания в долгосрочной перспективе.