有人可以解释为什么xna Rectangle结构的行为与它一样吗?

Ste*_*eve 2 c# xna

我很困惑为什么XNA Rectangle结构被编写得像.

如果我运行此代码:

var bounds = new Rectangle(0, 0, 10, 10);
        var bounds2 = new Rectangle(0, 10, 10, 10);
        var bounds3 = new Rectangle(0, 19, 10, 10);

        Debug.Print("Bounds X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}", 
            bounds.X, bounds.Y, bounds.Top, bounds.Left, bounds.Bottom, bounds.Right);

        Debug.Print("Bounds2 X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
            bounds2.X, bounds2.Y, bounds2.Top, bounds2.Left, bounds2.Bottom, bounds2.Right);

        Debug.Print("Bounds2 X: {0}, Y: {1}, Top: {2} Left: {3} Bottom: {4} Right {5}",
            bounds3.X, bounds3.Y, bounds3.Top, bounds3.Left, bounds3.Bottom, bounds3.Right);

        Debug.Print("bounds.Intersects(bounds2): {0}", bounds.Intersects(bounds2));
        Debug.Print("bounds2.Intersects(bounds3): {0}", bounds2.Intersects(bounds3));
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

Bounds X: 0, Y: 0, Top: 0 Left: 0 Bottom: 10 Right 10
Bounds2 X: 0, Y: 10, Top: 10 Left: 0 Bottom: 20 Right 10
Bounds2 X: 0, Y: 19, Top: 19 Left: 0 Bottom: 29 Right 10
bounds.Intersects(bounds2): False
bounds2.Intersects(bounds3): True
Run Code Online (Sandbox Code Playgroud)

这表明Intersects方法正常工作,因为bounds它不重叠bounds2但是由一行像素bounds2重叠bounds3.

然而,输出BottomRight只是觉得奇怪,我.它们都报告的值比我认为的要大1个像素,而且我总是被它抓住,导致沮丧.

例如,我可能会使用矩形为矩形精灵创建一个边界框.为了方便起见,我喜欢利用的Width,Height,RightBottom值,但RightBottom值不给我底行和纹理像素的右列,他们给我回行只是底部和列只是下面纹理的权利.

有这么好的理由吗?您是否在XNA中使用Rectangle作为边界框?如果是这样,您是否注意到相同的行为,或者您是否可以提供任何建议来改进我的方法?

谢谢

Nic*_*ler 5

我真的没有看到你的问题.如果矩形从a开始Left = 1并且具有Width3,则它从像素1到4到达:

长方形

在上图中,我选择了像素的中心作为其位置.如果我们说,像素的位置是它的左上角,那么该图看起来如下:

长方形

然后矩形从像素1的左上角到达像素4的左上角.可能会让你感到困惑的是,像素4的左上角是像素3的右上角.但这完全取决于你的解释的矩形.如果你保持解释一致,那么这一切都是有道理的.