2010-03-23 52 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

相关问题