所以基本上,我正在做我的第一个 xna 游戏,它是一款打砖块游戏。我现在的球是一个可以旋转的正方形。
不幸的是,无法正确检测 xna 中旋转矩形的碰撞。
我发现了关于标量的东西,但我只在大学学习计算机科学,所以我不知道这些大数学......
谁能指导我以正确的方式检测这种碰撞?或者至少能够以正确的方式获得一个新的矩形,以便我可以检测到这个矩形上的碰撞?
编辑 我只是想把我的旋转正方形变成一个静止的正方形并测试与外部正方形的碰撞是否可行?
所以基本上,我正在做我的第一个 xna 游戏,它是一款打砖块游戏。我现在的球是一个可以旋转的正方形。
不幸的是,无法正确检测 xna 中旋转矩形的碰撞。
我发现了关于标量的东西,但我只在大学学习计算机科学,所以我不知道这些大数学......
谁能指导我以正确的方式检测这种碰撞?或者至少能够以正确的方式获得一个新的矩形,以便我可以检测到这个矩形上的碰撞?
编辑 我只是想把我的旋转正方形变成一个静止的正方形并测试与外部正方形的碰撞是否可行?
如果要检测方形球与外部矩形的碰撞,则需要知道球的四个角的坐标。然后只需将这些点与外部矩形进行比较。
Ifs
是矩形的边长。角可以这样计算:
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;
你真的希望你的球是正方形的吗?或者一个简单的圆圈可以吗?
您可以改用碰撞圆,碰撞背后的逻辑比旋转的正方形要简单得多...(如果您真的想要正方形和像素完美的碰撞,请忽略此答案并查看 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
}
这并不是您问题的直接答案,而是更多的选择
编辑:此代码假定您的球的位置是相对于其中心的。
此外,您可以近似旋转正方形与碰撞圆(或事实上的非旋转正方形)的碰撞。碰撞不会是完美的像素,但我认为这几乎不会引起注意。它也将更容易实现(考虑到这是您的第一个游戏)。