我使用XNA,我做的很多事情之一就是將數據作爲Vector2s傳遞。現在,XNA中的許多對象(例如圖形設備等),包含Vector2的inste3ad會告訴您視口的大小,它們提供單獨的寬度和高度方法。有沒有辦法給它們添加一個Vector2屬性,這樣我就可以得到這些數據,而無需每次手動構建一個新的vector2我需要它?我想我要的是像「擴展屬性」 ......XNA寬度和高度到Vector2
回答
你可以用邁克爾的做法,但實際上每次都會創建一個新的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
}
}
擴展不被支持,但你仍然可以編寫一個擴展方法:
class ExtensionMethods
{
public static Vector2 GetViewSize(this GraphicsDevice device)
{
return new Vector2(device.Viewport.Width, device.Viewport.Height);
}
}
Vector2是值類型......說實話,你真的沒有擔心創建新實例太多,因爲它們是在堆棧上創建的。每次你可以使用.Vector屬性時,它都會創建一個新的實例。
儘管由於值類型不會調用垃圾回收器,您不必擔心。因此,嘗試實例化一次的最大原因是無效的(即GC)。
這就是說,對於較大的結構(如矩陣),您可能需要考慮傳遞它們byref以避免堆棧上的新分配。
使用新矢量的主要問題是它比僅使用變量長2或3倍。 – RCIX 2009-06-10 02:38:25
「在堆棧上創建」這是不正確的http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx – 2011-02-14 22:09:02
是@lukas,我寫了這個迴應在eric的博客文章發佈之前。但它至少部分正確;-) – 2011-02-15 10:45:13
就效率而言,最好只使用寬度和高度屬性來做任何你需要的地方。不要忘記優化的#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中的向量/點的東西變得更加簡單,但它也可能導致投射歧義,舍入誤差,截斷損失以及與數值轉換相關的所有其他有趣問題。所有這些問題都可以通過明確的轉換輕鬆解決,但請注意,如果在使用此結構時看到「奇怪的數字」,則可能是轉換過程中的精度損失。
- 1. 高度和寬度
- 2. 如何訪問C#XNA中位圖的寬度和高度?
- 3. Android |獲取屏幕高度,寬度和屏幕寬度,高度
- 4. JCrop得到裁剪寬度和高度
- 5. autoresizingmask高度和寬度
- 6. Youtube寬度和高度
- 7. libgdx optimal高度和寬度
- 8. setBound寬度和高度
- 9. 獲取高度和寬度
- 10. ImageButton的高度和寬度
- 11. WPF高度/寬度
- 12. Carrierwave和mini_magick查找寬度和高度
- 13. WP7組圖片元件高度/寬度的BitmapImage高度/寬度
- 14. 將WPF寬度/高度轉換爲VB 6寬度/高度
- 15. 使視頻寬高比保持最大100%寬度和高度
- 16. Imageview保持寬高比,填充寬度和高度
- 17. 寬度和高度不工作的寬度
- 18. ImageView寬度= 0.75x屏幕寬度和高度= 1.5 x新的ImageView寬度XML
- 19. Android Widget高度和寬度指定
- 20. 設置視頻的寬度和高度
- 21. CSS更改元素高度和寬度
- 22. 獲取圖像的寬度和高度
- 23. 選項菜單的寬度和高度?
- 24. AS3:ScaleX/ScaleY和寬度/高度問題
- 25. UIImageView - 固定寬度和靈活高度?
- 26. 獲得絕對的高度和寬度
- 27. 瀏覽器大小(寬度和高度)
- 28. 2列,最小寬度和100%高度
- 29. 指定繪圖的寬度和高度
- 30. 圓與高度100%和匹配寬度
這應該工作。謝謝! – RCIX 2009-06-09 23:00:28
我想我會從GraphicsDevice派生出來提供我需要的擴展,所以我的代碼可以使用我編寫的花哨插件,但任何使用常規圖形設備的東西仍然可以工作。由於這個答案啓發了這個想法,但它仍然是被接受的答案。謝謝! – RCIX 2009-06-09 23:05:41
我不確定GraphicsDevice是否被封裝(出於某種原因,我認爲它是),這就是爲什麼我提供了一個「包裝」解決方案。 – BFree 2009-06-09 23:11:46