如何创建与Rectangle兼容的自定义结构?

时间:2012-08-15 20:16:30

标签: c# struct custom-fields

我想创建一个Rectangle结构,其中包含x,y,width和height字段的byte s而不是int s。它应该与通常的Microsoft.Xna.Framework.Rectangle兼容(因为(bytesRectangle)应该没有问题)。我该怎么做?

Upd:使用此结构帮助我为每个磁贴节省了12个字节。

2 个答案:

答案 0 :(得分:3)

您必须定义转换以将您的类型转换为XNA框架所期望的类型。

见这里:http://msdn.microsoft.com/en-us/library/09479473.aspx

答案 1 :(得分:3)

我很想知道实现这个结构的设计选择。看看Microsoft.Xna.Framework.Rectangle,我们看到有超过30个属性和成员。这是为了节省几个字节而重现的。如果你唯一的目标是节省一些字节,那么可能会有更好的方法。例如,如果要将数据保存在较小的空间中,可以定义一个对象和一个转换来存储它。像这样:

class SmallRectangle
{
    public byte x { get; set; }
    public byte y { get; set; }

    public SmallRectangle(byte inx, byte iny)
    {
       x = inx;
       y = iny;
    }

    public static explicit operator SmallRectangle(Microsoft.Xna.Framework.Rectangle big)
    {
        SmallRectangle small = new SmallRectangle((byte)big.x, (byte)big.y);

        return small;
    }

    public WriteToFile(FileStream out)
    {
       //....
    }
}

当然,完整的实施将包括测试,以确保铸件等没有数据丢失。

根据您的评论如下:这不是方向。如果你真的需要在使用XNA时通过XNA保存内存,那么你应该创建一个小矩形管理器类,它不会以相同的方式存储它们具有相同的属性。但是这个类很适合在需要时创建XNA。不要让小矩形类(或管理器)“兼容”。

在内存中存储所需数据的最佳方法是只存储四个BYTES而不会产生任何开销。存储两个字节而没有开销的最佳方法是使用Tuple类。

所以我建议你创建一个矩形管理器类,在内部将矩形存储为元组,然后根据需要将它们“盒子”和“解盒”到Xna对象中。