Ширина и высота XNA для Vector2 - PullRequest
1 голос
/ 10 июня 2009

Я использую XNA, и одна из вещей, которые я часто делаю, - это передача данных как Vector2s. Теперь многие объекты в XNA (например, графические устройства и т. Д.), В которых имеется Vector2, который сообщает вам размер области просмотра, предлагают отдельные методы Width и Height. Есть ли способ добавить свойство Vector2 к ним, чтобы я мог получать эти данные, не создавая вручную новый вектор vector2 каждый раз, когда он мне нужен? я думаю, что я хочу что-то вроде "свойства расширения" ...

Ответы [ 4 ]

2 голосов
/ 24 декабря 2010

С точки зрения эффективности, лучше просто использовать свойства Width и Height, чтобы делать все, что вам нужно, где вы можете. Однако не забывайте правило оптимизации №1: не делайте этого .

Идея класса-обертки - хорошее решение, но я просто хотел выбросить идею глобально конвертируемой структуры. Я использую что-то вроде этого, чтобы избавиться от беспокойства о преобразованиях vector-> point и point-> vector (по крайней мере, во время отладки):

[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 и Point, делает вещи вектор / точка в Xna намного проще, но она также может привести к неоднозначности приведения, ошибкам округления, потерям усечения и всему остальному веселью проблемы, связанные с числовыми преобразованиями. Все эти проблемы легко решаются с помощью явных приведений, но имейте в виду, что если вы видите «странные числа» при использовании этой структуры, это, вероятно, связано с потерей точности при преобразованиях.

2 голосов
/ 10 июня 2009

Vector2 является типом значения ... честно говоря, вам не нужно особо беспокоиться о создании новых экземпляров, потому что они создаются в стеке. Каждый раз, когда вы можете использовать свойство .Vector, оно все равно будет создавать новый экземпляр.

вам не нужно об этом беспокоиться, потому что типы значений не вызывают сборщик мусора. Таким образом, самая большая причина, чтобы попытаться создать экземпляр один раз, сводится на нет (т.е. GC).

при этом для более крупных структур, таких как матрица, вы можете рассмотреть возможность их передачи по ref, чтобы избежать новых выделений в стеке.

1 голос
/ 10 июня 2009

Вы можете использовать подход Майкла, но на самом деле каждый раз создается новый 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
   }
}
1 голос
/ 10 июня 2009

Свойства расширения не поддерживаются, но вы все равно можете закодировать метод расширения:

class ExtensionMethods
{
    public static Vector2 GetViewSize(this GraphicsDevice device)
    {
        return new Vector2(device.Viewport.Width, device.Viewport.Height);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...