我很困惑为什么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.
然而,输出Bottom和Right只是觉得奇怪,我.它们都报告的值比我认为的要大1个像素,而且我总是被它抓住,导致沮丧.
例如,我可能会使用矩形为矩形精灵创建一个边界框.为了方便起见,我喜欢利用的Width,Height,Right和Bottom值,但Right和Bottom值不给我底行和纹理像素的右列,他们给我回行只是底部和列只是下面纹理的权利.
有这么好的理由吗?您是否在XNA中使用Rectangle作为边界框?如果是这样,您是否注意到相同的行为,或者您是否可以提供任何建议来改进我的方法?
谢谢
我真的没有看到你的问题.如果矩形从a开始Left = 1并且具有Width3,则它从像素1到4到达:

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

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