所以当我越来越多地使用 XNA 时,有一件事真的让我很困扰。X 和 Y 只能是整数,当您想使用向量作为字符位置时,这很糟糕,但想要矩形的交集方法。
所以我的问题是 Rectangle 结构中到底发生了什么?
我可能想太多了,但提前感谢您的任何意见。
XNA 缺少2D Axis-Aligned Bounding Box结构(使用浮点,不像Rectangle
)有点烦人。它有一个 3D 的,BoundingBox
如果您只是忽略 Z 轴,您可以重复使用它。
我个人编写自己的AABB
结构并使用它。或者,更确切地说,我写过一次,它只是在项目之间复制。这不是一个难写的结构。
我会在这里为您发布它,只是您已经特别询问了它是如何Rectangle
工作的(我自己的结构的运作方式完全不同)。所以这是我刚刚放在一起的一个,应该类似于Rectangle
:
public struct AABB
{
public float X, Y, Width, Height;
public static AABB Intersect(AABB a, AABB b)
{
AABB result;
result.X = Math.Max(a.X, b.X);
result.Y = Math.Max(a.Y, b.Y);
result.Width = Math.Min(a.X + a.Width, b.X + b.Width) - result.X;
result.Height = Math.Min(a.Y + a.Height, b.Y + b.Height) - result.Y;
if(result.Width < 0 || result.Height < 0)
return default(AABB);
else
return result;
}
}
作为我刚刚拼凑起来的东西,它并没有经过很好的测试。而且我不确定它会以与Rectangle
给定负宽度/高度时相同的方式响应。但是,正如您所看到的,它的代码并不多——所以它应该很容易修改。
通常碰撞和物理在单独的层上处理。他们定义的“矩形”将与这个不同。
XNA 矩形可能可用于 UI 内容和视口。
如果您想重新使用此矩形,则将您的字符数据存储为两个向量(x,y 和 w,h),并像 Lee Taylor 建议的那样提供到 Rectangle 的转换