【问题标题】:collision with rotated rectangle与旋转矩形碰撞
【发布时间】:2012-12-12 20:02:41
【问题描述】:

所以基本上,我正在做我的第一个 xna 游戏,它是一款打砖块游戏。我现在的球是一个可以旋转的正方形。

很遗憾,无法正确检测 xna 中旋转矩形的碰撞。

我发现了有关标量的东西,但我只在大学学习计算机科学,所以我不知道这些大数学...

谁能指导我以正确的方式检测这种碰撞?或者至少能够以正确的方式获得一个新的矩形,以便我可以检测到这个矩形上的碰撞?

编辑 我只是想把我的旋转正方形变成一个静止的正方形并测试与外部正方形的碰撞是否可行?

【问题讨论】:

标签: c# xna collision-detection rectangles


【解决方案1】:

如果要检测方形球与外部矩形的碰撞,则需要知道球的四个角的坐标。然后只需将这些点与外部矩形进行比较。

如果s 是矩形边的长度。角可以这样计算:

double h = 0.707106781 * s; // Half diagonal
double angle = rotation_angle + 0.25 * Math.PI; // 0.25 * Math.PI = 45 degrees
                                                // inclination of the diagonal.
double x = h * Math.Cos(angle);
double y = h * Math.Sin(angle);

// The four points are
p1x = +x + squareCenterX;
p1y = +y + squareCenterY;

p2x = -y + squareCenterX;
p2y = +x + squareCenterY;

p3x = -x + squareCenterX;
p3y = -y + squareCenterY;

p4x = +y + squareCenterX;
p4y = -x + squareCenterY;

【讨论】:

    【解决方案2】:

    你真的希望你的球是正方形的吗? 或者一个简单的圆圈可以吗?

    您可以改用碰撞圆,碰撞背后的逻辑比旋转的正方形要简单得多...(如果您真的想要正方形和像素完美的碰撞,请忽略此答案并查看 Terrance 的评论)

    if(circle.Center.X - circle.Radius < ScreenBounds.XMin || 
        circle.Center.X + circle.Radius > ScreenBounds.XMax ||
        circle.Center.Y - circle.Radius < ScreenBounds.YMin || 
        circle.Center.Y + circle.Radius > ScreenBounds.YMax)
    {
         //Ball is partly or entirely outside of the screen
    }
    

    这并不是对您问题的直接回答,而是更多的选择

    编辑:此代码假定您的球的位置是相对于其中心的。

    此外,您可以近似您的旋转正方形与碰撞圆(或事实上的非旋转正方形)的碰撞。碰撞不会是像素完美的,但我认为这几乎不会引起注意。它也将更容易实现(考虑到这是您的第一款游戏)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多