2

我只想检查两个物体是否碰撞,在这种情况下它是一个圆形,第二个是一个正方形。我正在使用的代码完美运行,但它只检查正方形的右侧向下/底部是否发生碰撞,请帮我纠正它,以便我能够检查所有侧面的碰撞。

在此处输入图像描述

问题是我只想检查正方形的所有边,如果它与圆相撞,但它只检查下面的函数的两个边:

 bool Collision(int circleX, int circleY, int radius, 
                   int squareX, int squareY, int width, int height)
    {

        double distance = 0;

        //get circle of square
        double center_square_x = (double)(squareX + squareX + width)/2;
        double center_square_y = (double)(squareY + squareY + height)/2;

        //check for whether circle fully located inside square
        if (circleX >= squareX && circleX <= squareX + width
            && circleY >= squareY && circleY <= squareY + height)
            return true;

        distance =  pow (circleX - center_square_x,2.0) 
                  + pow(circleY - center_square_y,2.0);

        if( distance <= pow(radius, 2.0))
           return true; 
       else    
           return false;
     }

显示错误的图片:

当圆圈靠在左边并且仍然没有碰到正方形时:

在此处输入图像描述

现在,当它触摸正方形时,它会根据需要返回 true:

在此处输入图像描述

当圆圈靠在右边并且仍然没有碰到正方形时,它返回 false:

在此处输入图像描述

现在当它触及正方形时,它仍然返回错误,这是错误的:

在此处输入图像描述

当圆圈上升到正方形的底部并触摸时,它返回 true,这是正确的:

在此处输入图像描述

但是当圆圈下降到正方形的顶部并触摸时,它返回 false,这是错误的:

在此处输入图像描述

4

1 回答 1

1

试试这个

bool Collision(int circleX, int circleY, int radius, 
               int squareX, int squareY, int width, int height)
{

    double distance = 0;

    //get circle of square (the center of the rectangle or square is
    // (squareX + width)/2 and (squareY+height)/2

    double center_square_x = (double)(squareX + width)/2;
    double center_square_y = (double)(squareY + height)/2;

    // check for each segment the circle position

    // check if the circle is between the bottom and upper square segments
    if (circleY >= squareY && circleY <= squareY + height) 
           // check for left segment
           if (circleX >= squareX && circleX < centerX )
           return true;
           // check for right segment
       else if (circleX <= squareX+width && circleX > centerX)
           return true;
     // check if the circle is between left and right square segments
    else if (circleX >= squareX && circleX <= squareX + width)
         // check for upper segment
         if (circleY >= squareY && circleY < centerY)
           return true;
         // check for bottom segment
        else if (circleY <= squareY + height && circleY > centerY)
           return true;

我不知道你想通过距离计算来实现什么,但它不会到达那里。因为当你在检查碰撞后返回 true 时,函数将退出它的范围。

于 2013-04-14T18:18:54.123 回答