0

我可以使用该函数CheckCollisionCircleRec(Vector2{ x, y }, radius, paddleRect)简单地找出我的圆是否与我的矩形相撞,但我希望能够找出我的圆与矩形的哪一侧相撞。我该怎么做呢?我所做的算法都不起作用。我最近的错误示例:

if (x - radius <= 0 || x + radius >= screenWidth) {
            speedX *= -1;
        }
        else if (y - radius <= 0 || y + radius >= screenHeight) {
            speedY *= -1;
        }
        else if (CheckCollisionCircleRec(Vector2{ x, y }, radius, paddleRect)) {
            float paddleBottom = paddleRect.y + paddleRect.height;
            float paddleRight = paddleRect.x + paddleRect.width;

            if (range(paddleRect.x, paddleRect.x + speedX / 100, x + radius)) {
                x = paddleRect.x - radius;
                speedX *= -1;
            }
            if (range(paddleRight - speedX / 100, paddleRight, x - radius)) {
                x = paddleRight + radius;
                speedX *= -1;
            };

            if (range(paddleRect.y, paddleRect.y + speedY / 100, y + radius)) {
                y = paddleRect.y - radius;
                speedY *= -1;
            }
            if (range(paddleBottom - speedY / 100, paddleBottom, y - radius)) {
                y = paddleBottom + radius;
                speedY *= -1;
            };

编辑:这是我用来获得工作最终结果的函数:

// px and py are the ball's previous locations
// x and y are the ball's current locations

void checkCollision(Rectangle rectangle) {

    int left = rectangle.x;
    int right = rectangle.x + rectangle.width;
    int top = rectangle.y;
    int bottom = rectangle.y + rectangle.height;

    if (CheckCollisionCircleRec(Vector2{ x, y }, radius, rectangle)) {

        if (px < left) {
            speedX = negative(speedX);
            x = left - radius;
        }
        else if (px > right) {
            speedX = positive(speedX);
            x = right + radius;
        }
        else if (py < top) {
            speedY = negative(speedY);
            y = top - radius;
        }
        else if (py > bottom) {
            speedY = positive(speedY);
            y = bottom + radius;
        };
    };
};
4

1 回答 1

1

一种简单的方法是使用您圈子的先前位置。不确定你是否可以在你的程序中,但由于你有一个方便的 x 和 y,我假设你可以有一个 prevX 和 prevY。我还将假设这些值代表圆的中心。

现在如果 (prevX < paddleRect.x),那么您可能会与左侧发生碰撞(不能保证,但要完全准确地解决歧义需要以越来越小的时间步长递归地模拟您的物理场,这在这里可能是不必要的)。您还可以使用 if (prevX < paddleRect.x && prevY > paddleRect.y && prevY < paddleRect.y + paddRect.height) 更严格地限制它。您可以添加各种约束,具体取决于您希望在检测到侧面之前被击中的干净程度。您可以添加角球等。

使用前一个位置的原因是,如果你的圆圈移动得足够快,那么在一帧中它可以直接跳到矩形的中间。在当前位置碰撞中,通常需要使用之前的位置来提供更具体的碰撞信息

于 2022-02-22T23:16:39.963 回答