Как исправить застревание объектов в столкновениях

#java #collision-detection

#java #обнаружение столкновений

Вопрос:

В java-игре, которую я создаю, у меня есть проигрыватель и настенная плитка. Когда игрок движется вперед, он проверяет, сталкивается ли он со стеной в этом коде:

 player.moveForward2(playerSpeed); //moves player forward
            
for (int i = 1; i <=100; i  ) {
    for (int j = 1; j <=50; j  ) {
        map1.map[(int) (i-1)][(int) (j-1)].getRect(); //gets rectangle from object on screen
        player.getRect();
        
        if (player.r.intersects(map1.map[(int) (i-1)][(int) (j-1)].r)) { //checks if player is intersecting rectangle after moving
            if (map1.map[(int) (i-1)][(int) (j-1)].id == 3) { //checks that player isn't able to pass through this tile
                player.moveBackward2(playerSpeed); // moves back if space cannot be moved into
            }
        }
        
    }
}

  

Проблема в том, что когда он перемещается в прямоугольник, он застревает и не может двигаться ни в каком направлении. Метод предназначен для того, чтобы позволить ему перемещаться в прямоугольник и скользить по нему, не застревая на нем. Игрок находится в центре экрана, и другие плитки перемещаются, если это что-то значит.

Комментарии:

1. здесь много неизвестных. пожалуйста, поделитесь подробностями о методах, что они делают, и nit: почему вы набираете (int) (i-1) тип?? оба i и j уже определены как int .

2. @roottraveller Сначала запускается moveForward2() метод в проигрывателе, который изменяет координаты, сохраненные в проигрывателе, что влияет на то, где рисуются плитки. Он выполняет итерацию по остальной части кода для каждой плитки, сначала получая прямоугольник вокруг проигрывателя и плитки, указанной циклами for , затем проверяя, пересекаются ли прямоугольники. если они это делают, это перемещает игрока в противоположную сторону. Что касается приведения типов, это была ошибка, я скопировал циклы из предыдущего метода, где они были необходимы.

3. все еще не очень понятно. player.getRect(); что это делает? возвращает ли оно какое-то значение? можете ли вы обновить правильную постановку задачи?