与旋转的矩形碰撞

时间:2012-12-12 20:02:42

标签: c# xna collision-detection rectangles

所以基本上,我正在做我的第一个xna游戏,这是一个arkanoid游戏。我的球现在是一个旋转的方形。

不幸的是,无法正确检测xna中旋转矩形的碰撞。

我找到了关于标量的事情,但我只是在大学的计算机科学,所以我不知道这些大数学......

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

修改 我只是考虑将我的旋转方块放在一个静止的正方形中并测试与外部方块的碰撞是否可行?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

你可以使用碰撞圈,碰撞背后的逻辑比旋转的方块简单得多......(如果你真的想要一个正方形和一个像素完美的碰撞,请忽略这个答案,看看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
}

这不是你问题的直接答案,而是更多的替代

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

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