C# XNA矩形是如何工作的?

C# XNA矩形是如何工作的?,c#,xna,xna-4.0,C#,Xna,Xna 4.0,因此,随着我越来越多地使用XNA,有一件事让我非常困扰。X和Y只能是整数,当您想要使用矢量作为字符位置,但想要使用矩形的求交方法时,这很糟糕 所以我的问题是矩形结构中到底发生了什么 我可能已经想得太多了,但还是要感谢您提前提供的信息。通常碰撞和物理是在一个单独的层上处理的。他们定义的“矩形”将与此不同 XNA矩形可能可以用于UI内容和视口 如果你想重复使用这个矩形,那么将你的字符数据存储为两个向量(x,y和w,h),并提供一个到矩形的转换,就像Lee Taylor所建议的那样,XNA缺少一个二维

因此,随着我越来越多地使用XNA,有一件事让我非常困扰。X和Y只能是整数,当您想要使用矢量作为字符位置,但想要使用矩形的求交方法时,这很糟糕

所以我的问题是矩形结构中到底发生了什么


我可能已经想得太多了,但还是要感谢您提前提供的信息。

通常碰撞和物理是在一个单独的层上处理的。他们定义的“矩形”将与此不同

XNA矩形可能可以用于UI内容和视口


如果你想重复使用这个矩形,那么将你的字符数据存储为两个向量(x,y和w,h),并提供一个到矩形的转换,就像Lee Taylor所建议的那样,XNA缺少一个二维轴对齐的边界框(它使用浮点,不像
矩形
)有点烦人。它有一个3D界面,
BoundingBox
,如果忽略Z轴,可以重复使用

我个人编写自己的
AABB
结构并使用它。或者,更确切地说,我写过一次,它只是在项目之间被复制。这不是一个难写的结构

我会把它贴在这里,只是你特别问了
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;
    }
}
公共结构AABB
{
公共浮标X、Y、宽度、高度;
公共静态AABB交叉点(AABB a、AABB b)
{
AABB结果;
结果X=数学最大值(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)
返回默认值(AABB);
其他的
返回结果;
}
}

我只是把它拼凑在一起,它并没有经过很好的测试。当给定负宽度/高度时,我不确定它的响应方式是否与矩形相同。但是,正如您所看到的,它没有太多的代码,所以应该很容易修改。

如果您想要更好的分辨率,请将坐标存储为缩放的更大整数。e、 g.3.174成为3174@Lee故意降低精度并引入这样一个(容易出错的)比例因子并不是一个好主意。