Question

Je travaillais avec Vector2 et XNA, et j'ai découvert qu'appeler la fonction membre Normalize () sur un vecteur nul le normalise en un vecteur {NaN, NaN}. C’est très bien, mais dans mon cas, je préférerais que ce soit plutôt que de les laisser comme des vecteurs nuls.

L'ajout de ce code à mon projet a activé une méthode d'extension mignonne:

using ExtensionMethods;

namespace ExtensionMethods
{
    public static class MyExtensions
    {
        public static Vector2 NormalizeOrZero(this Vector2 v2)
        {
            if (v2 != Vector2.Zero)
                v2.Normalize();
            return v2;
        }
    }
}

Malheureusement, cette méthode renvoie le vecteur normalisé, au lieu de simplement normaliser le vecteur que j'utilise pour appeler cette méthode d'extension. Je voudrais plutôt me comporter comme vector2Instance .Normalize () le fait.

Hormis l’élimination de ce vide, comment puis-je l’ajuster pour que la 'v2' soit modifiée? (J'ai essentiellement besoin d'accéder à l'objet 'this' ou j'ai besoin que 'v2' soit passé par référence.)

Modifier:

Et oui, j'ai essayé ceci:

    public static void NormalizeOrZero(this Vector2 v2)
    {
        if (v2 != Vector2.Zero)
            v2.Normalize();
    }

Ne fonctionne pas, la v2 n'est qu'une variable dans la portée de NormalizeOrZero.

Était-ce utile?

La solution

Cela ne fonctionne pas car le vecteur 2 est en fait une structure . Cela signifie qu'il est transmis par valeur et que vous ne pouvez pas modifier la copie de l'appelant. Je pense que le mieux que vous puissiez faire est la solution de contournement spécifiée par lomaxxx.

Ceci illustre pourquoi vous devriez généralement éviter d'utiliser des structures. Voir cette question pour plus d'informations. Vector2 viole la directive selon laquelle les structures doivent être immuables, mais il était probablement logique de le faire dans le contexte de XNA.

Autres conseils

Eh bien, si vous êtes vraiment juste en train de mourir pour faire cela, vous pouvez faire quelque chose comme ceci:

public static void NormalizeOrZero(this Vector2 ignore, ref Vector2 v2)
{
    if (v2 != Vector2.Zero)
        v2.Normalize();
}

Vous l'appelleriez ainsi:

v2.NormalizeOrZero(ref v2);

C’est très laid, mais ça marche, pour ce que ça vaut. Mais à ce stade, vous pouvez également appeler une méthode statique.

Je ne sais pas pourquoi votre deuxième exemple de code ne fonctionne pas, mais si le premier lot de code donne ce que vous voulez, vous pouvez simplement le contourner en allant:

Vector2 v2 = new Vector2()
v2 = v2.NormalizeOrZero();

Vous auriez besoin à la fois de ref et du this modificateur sur l'argument, ce qui semble peu probable que cela fonctionne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top