Как предотвратить движение круга при столкновении с прямоугольником? - PullRequest
0 голосов
/ 16 апреля 2019

Я создал игру-лабиринт, в которой пользователь управляет мячом и должен перемещать его через лабиринт.Проблема, с которой я сталкиваюсь, заключается в том, что когда мяч сталкивается со стеной, он не должен проходить сквозь стену.Я смог обнаружить столкновение, используя это: https://stackoverflow.com/a/402010/11365940

Я не уверен, как предотвратить прохождение мяча мимо стены.

Я пытался делать такие вещи, как

BALL_X = wall.left - BALL_RADIUS;

, который будет работать только тогда, когда правая часть мяча коснулась левой части стены.Но я не знаю, как это обнаружить.Я знаю только, как обнаружить столкновение.

Вот код, который я написал для обнаружения столкновений.

for (Rect wall : walls) {
    double wallWidth = wall.right - wall.left;
    double wallHeight = wall.bottom - wall.top;
    double wallX = wallWidth / 2 + wall.left;
    double wallY = wallHeight / 2 + wall.top;
    double circleDistanceX = Math.abs(BALL_X - wallX);
    double circleDistanceY = Math.abs(BALL_Y - wallY);
    if (circleDistanceX > wallWidth / 2 + BALL_RADIUS) {
        continue;
    }
    if (circleDistanceY > wallHeight / 2 + BALL_RADIUS) {
        continue;
    }
    if (circleDistanceX <= wallWidth / 2) {
        // collision here
    }
    if (circleDistanceY <= wallHeight / 2) {
        // collision here
    }
    double cornerDistanceSq = Math.pow(circleDistanceX - wallWidth, 2) +
            Math.pow(circleDistanceY - wallHeight, 2);
    if (cornerDistanceSq <= BALL_RADIUS) {
        // collision here
    }
}

1 Ответ

0 голосов
/ 16 апреля 2019

Так что вы всегда должны определять, перекрывают ли они друг друга, вот код

if(Math.abs(circle.CircleCenterY - rectangle.top) < circle.radius) {
    if(circle.CircleCenterX >= rectangle.left) {
         if(circle.CircleCenterY <= rectangle.right) {
             // circle touched the top edge
         }
         else {
             // circle touched the right corner
         }
    }
    else {
         // circle touched the top left corner
    }
}
...