开发者

XNA Class Design with Structs as Properties and issues because they are value types and not reference types

开发者 https://www.devze.com 2022-12-24 20:21 出处:网络
I\'m wondering how you\'d recommend designing a class, given the fact that XNA Framework uses Struct all over the place?

I'm wondering how you'd recommend designing a class, given the fact that XNA Framework uses Struct all over the place?

For example, a spite class, which may require a Vector2 and a Rectangle (both d开发者_如何学Goefined as Struct) to be accessed outside of the class.

The issue come in when you try to write code like this:

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;

The second option compiles and works, but it is just butt ugly. Is there a better way?


Or, just to throw this out there ... just expose the field. There's nothing inherently wrong with exposing a public field.

For example, if your entity exposes a Vector3 for it's position so that other things can use that value in their own calculations ... just expose it. Otherwise, if no other class or entity needs to know the position, do not expose it at all :-)

Here is some sage advice from Rico Mariani:

Generally, my feeling is that properties are highly overrated and fields terribly under-utilized. Did I mention that not everyone agrees with this position? :)


Add a method to your item class something like:

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

That way the uglyness is nice and abstracted so you can just call the method like this:

i.Move(1,1)

which would move it down to the right one pixel. You could have variations of this method like MoveRight() MoveLeft() etc..


You can abstract away the struct as well:

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

And use it like this:

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

精彩评论

暂无评论...
验证码 换一张
取 消