О чем следует помнить при создании класса IntVector2 в C #? - PullRequest
1 голос
/ 17 июня 2011

В настоящее время я пытаюсь написать несколько классов, чтобы помочь мне в написании различных приложений и / или игр, которые в основном 2D. Одной из вещей, которые мне действительно нужны (так как класс C # XNA "Point" отстой) был класс IntVector2, который должен быть очень похож на стандартный класс XNA "Vector2".

В настоящее время у меня есть эта кодировка (больше вещей после перерыва):

using System;
using Microsoft.Xna.Framework;

namespace LPG.Utilities
{
    public class IntVector2
    {
        //Properties
        public readonly int X = 0;
        public readonly int Y = 0;
        private float magnitude = 0;

        //Special properties

        public float Magnitude
        {
            get
            {
                if (this.magnitude == 0)
                {
                    return (float)Math.Sqrt((Math.Abs(this.X ^ 2) + Math.Abs(this.Y ^ 2)));
                }
                else
                {
                    return this.magnitude;
                }
            }
        }

        //Methods

        public Vector2 Normalize()
        {
            return new Vector2(this.X / (float)this.Magnitude, this.Y / (float)this.Magnitude);
        }

        //Constructors

        public IntVector2()
        {
        }

        public IntVector2(int Both)
        {
            this.X = Both;
            this.Y = Both;
        }

        public IntVector2(int X, int Y)
        {
            this.X = X;
            this.Y = Y;
        }

        //Casts

        public static implicit operator Vector2(IntVector2 From)
        {
            return new Vector2(From.X, From.Y);
        }

        public static implicit operator IntVector2(Vector2 From)
        {
            return new IntVector2((int)From.X, (int)From.Y);
        }

        public static implicit operator string(IntVector2 From)
        {
            return "(" + From.X + ", " + From.Y + ")";
        }

        //IntVector2-IntVector2 operators

        public static IntVector2 operator +(IntVector2 First, IntVector2 Second)
        {
            return new IntVector2(First.X + Second.X, First.Y + Second.Y);
        }

        public static IntVector2 operator -(IntVector2 First, IntVector2 Second)
        {
            return new IntVector2(First.X - Second.X, First.Y - Second.Y);
        }

        public static IntVector2 operator *(IntVector2 First, IntVector2 Second)
        {
            return new IntVector2(First.X * Second.X, First.Y * Second.Y);
        }

        public static IntVector2 operator /(IntVector2 First, IntVector2 Second)
        {
            return new IntVector2(First.X / Second.X, First.Y / Second.Y);
        }

        //IntVector2-int operators:

        public static IntVector2 operator +(IntVector2 First, int Second)
        {
            return new IntVector2(First.X + Second, First.Y + Second);
        }

        public static IntVector2 operator -(IntVector2 First, int Second)
        {
            return new IntVector2(First.X - Second, First.Y - Second);
        }

        public static IntVector2 operator *(IntVector2 First, int Second)
        {
            return new IntVector2(First.X * Second, First.Y * Second);
        }

        public static IntVector2 operator /(IntVector2 First, int Second)
        {
            return new IntVector2(First.X / Second, First.Y / Second);
        }
    }
}

Что я должен сделать, чтобы улучшить этот класс? Я думал об использовании структуры вместо класса, но я не достаточно опытен, чтобы принять реальное решение.

Заранее спасибо.

1 Ответ

1 голос
/ 17 июня 2011

Я бы порекомендовал структуру, если вы собираетесь ее много обновлять, поскольку с тех пор она не будет способствовать сборке мусора, что, если вы разрабатываете на xbox, является небольшой проблемой.

Ваш метод величины возвращает число с плавающей точкой, нет необходимости преобразовывать его при использовании в Normalize.

Вы не сохраняете величину при вычислении.

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

Вы можете создать переопределение для ToString (отлично подходит для отладки / печати на экране и т. д.), а также == Equals и GetHashCode.

Я не уверен, что мне нравится иметь явный оператор преобразования для string.Я думаю, это должно быть то, для чего ToString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...