如何在与矩形碰撞时阻止圆移动?

问题描述 投票:0回答:1

我创造了一个迷宫游戏,用户控制一个球并且必须通过迷宫移动它。我遇到的问题是当球与墙碰撞时,它不应该穿过墙壁。我已经能够通过使用这个来检测碰撞: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
    }
}
java android canvas 2d
1个回答
0
投票

所以你必须始终检测它们是否相互重叠,这是代码

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.