2009-06-09 46 views
1

我使用XNA,我做的很多事情之一就是將數據作爲Vector2s傳遞。現在,XNA中的許多對象(例如圖形設備等),包含Vector2的inste3ad會告訴您視口的大小,它們提供單獨的寬度和高度方法。有沒有辦法給它們添加一個Vector2屬性,這樣我就可以得到這些數據,而無需每次手動構建一個新的vector2我需要它?我想我要的是像「擴展屬性」 ......XNA寬度和高度到Vector2

回答

1

你可以用邁克爾的做法,但實際上每次都會創建一個新的Vector2。如果你真的只希望Vector2創建一次,你可以用你想要的類,並提供自己的Vector2屬性:

public class GraphicsDeviceWrapper 
{ 
    private Vector2 vector; 
    public GraphicsDeviceWrapper(GraphicsDevice device) 
    { 
     this.vector = new Vector2(device.Viewport.Width, device.Viewport.Height); 
     this.Device = device; 
    } 

    public Vector2 Vector 
    { 
     get{return this.vector;} 
    } 

    public GraphicsDevice Device 
    { 
     get; private set 
    } 
} 
+0

這應該工作。謝謝! – RCIX 2009-06-09 23:00:28

+0

我想我會從GraphicsDevice派生出來提供我需要的擴展,所以我的代碼可以使用我編寫的花哨插件,但任何使用常規圖形設備的東西仍然可以工作。由於這個答案啓發了這個想法,但它仍然是被接受的答案。謝謝! – RCIX 2009-06-09 23:05:41

+0

我不確定GraphicsDevice是否被封裝(出於某種原因,我認爲它是),這就是爲什麼我提供了一個「包裝」解決方案。 – BFree 2009-06-09 23:11:46

1

擴展不被支持,但你仍然可以編寫一個擴展方法:

class ExtensionMethods 
{ 
    public static Vector2 GetViewSize(this GraphicsDevice device) 
    { 
     return new Vector2(device.Viewport.Width, device.Viewport.Height); 
    } 
} 
2

Vector2是值類型......說實話,你真的沒有擔心創建新實例太多,因爲它們是在堆棧上創建的。每次你可以使用.Vector屬性時,它都會創建一個新的實例。

儘管由於值類型不會調用垃圾回收器,您不必擔心。因此,嘗試實例化一次的最大原因是無效的(即GC)。

這就是說,對於較大的結構(如矩陣),您可能需要考慮傳遞它們byref以避免堆棧上的新分配。

+0

使用新矢量的主要問題是它比僅使用變量長2或3倍。 – RCIX 2009-06-10 02:38:25

+0

「在堆棧上創建」這是不正確的http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx – 2011-02-14 22:09:02

+0

是@lukas,我寫了這個迴應在eric的博客文章發佈之前。但它至少部分正確;-) – 2011-02-15 10:45:13

2

就效率而言,最好只使用寬度和高度屬性來做任何你需要的地方。不要忘記優化的#1規則,但是:don't do it

包裝類的想法是一個很好的解決方案,但我只是想拋出一個全球可轉換結構的想法。我用這樣的事情有擔心病媒>點和點 - >矢量轉換(調試至少期間)做掉:

[DebuggerDisplay("{value}")] 
public struct PointyVector 
{ 
    Vector2 value; 

//Constructors: 
    public PointyVector(System.Drawing.Point point) 
    { 
     value = new Vector2(point.X, point.Y); 
    } 
    public PointyVector(Point point) 
    { 
     value = new Vector2(point.X, point.Y); 
    } 
    public PointyVector(Vector2 vector) 
    { 
     value = new Vector2(vector.X, vector.Y); 
    } 


//Implicit conversion operators: 
    public static implicit operator PointyVector(Vector2 vector) 
    { 
     return new PointyVector(vector); 
    } 
    public static implicit operator PointyVector(System.Drawing.Point point) 
    { 
     return new PointyVector(point); 
    } 
    public static implicit operator PointyVector(Point point) 
    { 
     return new PointyVector(point); 
    } 
    public static implicit operator Vector2(PointyVector vector) 
    { 
     return vector.value; 
    } 
    public static implicit operator Point(PointyVector vector) 
    { 
     return new Point((int)vector.X, (int)vector.Y); 
    } 

} 

這種結構,增加Vector2和點之間的一些二元運算,使得Xna中的向量/點的東西變得更加簡單,但它也可能導致投射歧義,舍入誤差,截斷損失以及與數值轉換相關的所有其他有趣問題。所有這些問題都可以通過明確的轉換輕鬆解決,但請注意,如果在使用此結構時看到「奇怪的數字」,則可能是轉換過程中的精度損失。