2010-03-23 57 views
2

我想知道如何建議設計一個類,因爲XNA框架使用結構遍佈整個地方?XNA類設計與Structs作爲屬性和問題,因爲它們是值類型,而不是引用類型

例如,spite類可能需要在類的外部訪問Vector2和Rectangle(都定義爲Struct)。

問題進來,當你嘗試寫這樣的代碼:

class Item 
{ 
    public Vector2 Position {get; set;} 
    public Item() { Position = new Vector2(5,5); } 
} 

Item i = new Item(); 
i.Positon.X = 20; // fails with error 'Cannot modify the return value of Item because it is not a variable.' 

// you must write code like this 
var pos = i.Position; 
pos.X++; 
i.Position = pos; 

第二個選項編譯和作品,但它僅僅是屁股難看。有沒有更好的辦法?

回答

6

或者,只是把它扔到那裏......只是暴露這個領域。揭露公共領域沒有任何內在的錯誤。

例如,如果您的實體公開了一個Vector3的位置,以便其他事物可以在他們自己的計算中使用該值......只是將其公開。否則,如果沒有其他的類或實體需要知道的位置,不要將其暴露在所有:-)

下面是一些Rico Mariani明智的建議:

一般情況下,我的感覺是性能高度高估和田地利用非常低。我有沒有提到不是每個人都同意這個立場? :)

+0

所以你說的是做這樣的事情'public Vector2 Position;'替代'public Vector2 Positin {get;設置;}' – Nate 2010-03-24 01:53:06

+0

是的,實際上......更新了答案,並附有Rico Mariani的一篇很棒的帖子的鏈接 – 2010-03-24 01:55:19

+0

只有當你的類不希望在位置改變時更新其他東西,或者沒有任何錯誤,不需要爲運動做一些特殊的計算,或者類似的事情。 – Bob 2010-03-24 04:19:18

5

的方法添加到您的項目類是這樣的:

public void Move(int xAmount, int yAmount) 
{ 
    var newPosition = new Point(this.Position.X + xAmount, this.Position.Y + yAmount); 
    this.Position = newPosition; 
} 

這樣的uglyness是好的,抽象所以你可以這樣調用方法:

i.Move(1,1) 

這將移動它向右一個像素。可以使用這個方法的變化像MoveRight()MoveLeft()等。

3

你可以抽象掉struct還有:

private Vector2 position; 
public float X 
{ 
    get 
    { 
     return position.X; 
    } 
    set 
    { 
     position.X = value; 
    } 
} 

而且使用這樣的:

Item i = new Item(); 
i.X = 20; 
+0

-1:它的作品,但變異的結構是邪惡的。 http://blogs.msdn.com/ericlippert/archive/2008/05/14/mutating-readonly-structs.aspx – Juliet 2010-03-24 02:18:09

+1

@Juliet這不是一個自變量結構,就像該博客鏈接中提到的那樣。我在做什麼與在屬性中使用任何其他私有值類型變量基本上沒有區別。由get返回一個float,並且專用結構更新,因爲它應該在集合中。它的工作原理是因爲它不是邪惡的,沒有拷貝正在處理 – Bob 2010-03-24 04:13:38

相關問題