【问题标题】:Can't detect collision properly using Rectangle.Intersects()无法使用 Rectangle.Intersects() 正确检测碰撞
【发布时间】:2012-12-18 07:33:54
【问题描述】:

我使用单个精灵表图像作为我的突破游戏的主要纹理。图片是这样的:

我的代码有点混乱,因为我使用 Point 从同一个纹理创建两个元素,以表示元素大小及其在图纸上的位置,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;

我的初始化也有点混乱,但它按预期工作:

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);

还有图纸:

spriteBatch.Draw(sheet, paddleViewportPosition, paddleRectangle, Color.White);
spriteBatch.Draw(sheet, ballViewportPosition, ballRectangle, Color.White);

问题是我无法正确检测到碰撞,使用以下代码:

if(ballRectangle.Intersects(paddleRectangle))
{
    ballVelocity.Y = -ballVelocity.Y;
}

我做错了什么?

【问题讨论】:

    标签: c# xna collision-detection


    【解决方案1】:

    您正在测试基于 sourceRectangles 的精灵表纹理的碰撞。这些矩形(paddleRectangleballRectangle)是根据纹理坐标定义的——即这些精灵在图纸上的位置。测试这些矩形的碰撞是没有意义的。

    您需要使用屏幕坐标进行碰撞,也就是说,您需要用屏幕位置定义不同的矩形:

    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;
    }
    

    【讨论】:

    • 我确实有两个不同的矩形(请参阅编辑后的帖子)。我很确定初始化有问题……
    • @DanielRibeiro 我已经进行了编辑以使其清楚。尝试使用整个代码块进行碰撞。你的初始化没问题。
    • 我得到了 sourceRectangles 的问题。有没有更简单的方法来解决精灵表问题而不必为每个对象创建两个矩形?
    • @DanielRibero 我不这么认为,事实上我相信你这样做是正确的(预期的)方法。您问题中的代码(碰撞位除外)是可以的。还是您在我的回答中谈论这两个额外的矩形?
    • 不,当谈到最佳实践和重复代码时,我只是个怪胎。我现在就开始讨论,因为您的解决方案效果很好。非常感谢!我很高兴文档仅在一个简单的方法签名上就阐明了这么多!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    • 2017-11-26
    相关资源
    最近更新 更多