Dan*_*iro 5 c# xna collision-detection
我正在使用单个精灵表图像作为我的突破游戏的主要纹理.图像是这样的:

我的代码有点令人困惑,因为我使用a创建来自相同Texture的两个元素Point,以表示元素大小及其在工作表上的位置,a Vector,表示它在视口上的位置以及Rectangle表示元素本身的位置.
Texture2D sheet;
Point paddleSize = new Point(112, 24);
Point paddleSheetPosition = new Point(0, 240);
Vector2 paddleViewportPosition;
Rectangle paddleRectangle;
Point ballSize = new Point(24, 24);
Point ballSheetPosition = new Point(160, 240);
Vector2 ballViewportPosition;
Rectangle ballRectangle;
Vector2 ballVelocity;
Run Code Online (Sandbox Code Playgroud)
我的初始化也有点令人困惑,但它按预期工作:
paddleViewportPosition = new Vector2((GraphicsDevice.Viewport.Bounds.Width - paddleSize.X) / 2, GraphicsDevice.Viewport.Bounds.Height - (paddleSize.Y * 2));
paddleRectangle = new Rectangle(paddleSheetPosition.X, paddleSheetPosition.Y, paddleSize.X, paddleSize.Y);
Random random = new Random();
ballViewportPosition = new Vector2(random.Next(GraphicsDevice.Viewport.Bounds.Width), random.Next(GraphicsDevice.Viewport.Bounds.Top, GraphicsDevice.Viewport.Bounds.Height / 2));
ballRectangle = new Rectangle(ballSheetPosition.X, ballSheetPosition.Y, ballSize.X, ballSize.Y);
ballVelocity = new Vector2(3f, 3f);
Run Code Online (Sandbox Code Playgroud)
和图纸:
spriteBatch.Draw(sheet, paddleViewportPosition, paddleRectangle, Color.White);
spriteBatch.Draw(sheet, ballViewportPosition, ballRectangle, Color.White);
Run Code Online (Sandbox Code Playgroud)
问题是我无法正确检测到碰撞,使用此代码:
if(ballRectangle.Intersects(paddleRectangle))
{
ballVelocity.Y = -ballVelocity.Y;
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
您正在根据sourceRectangles精灵表纹理测试碰撞。这些矩形 ( paddleRectangle, ballRectangle) 是根据纹理坐标定义的- 即这些精灵在纸张上的位置。测试这些矩形的碰撞是没有意义的。
您需要使用屏幕坐标进行碰撞,也就是说,您需要使用屏幕位置定义不同的矩形:
Rectangle paddleViewportRectangle = new Rectangle(paddleViewportPosition.X,
paddleViewportPosition.Y,
paddleSize.X,
paddleSize.Y);
Rectangle ballViewportRectangle = new Rectangle(ballViewportPosition.X,
ballViewportPosition.Y,
ballSize.X,
ballSize.Y);
if(ballViewportRectangle.Intersects(paddleViewportRectangle))
{
ballVelocity.Y = -ballVelocity.Y;
}
Run Code Online (Sandbox Code Playgroud)