Frage

Ich habe mit Vector2 von und XNA zu arbeiten, und ich bin gekommen, um herauszufinden, dass die Normalisieren () Member-Funktion auf einem Nullvektor Aufruf normalisiert es zu einem Vektor {NaN, NaN}. Das ist alles schön und gut, aber in meinem Fall würde ich es vorziehen, statt nur lasse sie als Null-Vektoren.

Das Hinzufügen dieser Code zu meinem Projekt eine nette Erweiterung Methode aktiviert:

using ExtensionMethods;

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

Leider ist diese Methode Rückgabe die normalisierte Vektor, anstatt einfach nur die Normalisierung des Vektors, die ich verwenden diese Erweiterung Methode aufzurufen. Ich möchte stattdessen als verhalten vector2Instance .Normalize () der Fall ist.

Neben dieser Lücke aus machen, wie stelle ich das so, dass die ‚v2‘ geändert wird? (Im Grunde muss ich Zugriff auf das ‚this‘ Objekt oder ich brauche ‚v2‘ als Referenz übergeben werden.)

Edit:

Und ja, ich habe dies versucht:

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

nicht funktioniert, v2 ist nur eine Variable im Rahmen NormalizeOrZero.

War es hilfreich?

Lösung

Das funktioniert nicht, weil Vector 2 ist eigentlich eine Struktur . Dies bedeutet, es von Wert übergeben wird, und Sie können die Anrufer-Kopie nicht ändern. Ich denke, das Beste, was Sie tun können, die Abhilfe durch lomaxxx angegeben ist.

Dies zeigt, warum Sie in der Regel Strukturen mit vermeiden sollten. Siehe diese Frage für weitere Informationen. Vector2 verstößt gegen die Richtlinie, die structs unveränderlich sein soll, aber es wahrscheinlich sinnvoll, so im Rahmen von XNA zu tun.

Andere Tipps

Nun, wenn Sie wirklich nur sind Sterben , dies zu tun, können Sie etwas tun könnte:

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

Sie würden es so nennen:

v2.NormalizeOrZero(ref v2);

Es ist mächtig hässlich, aber es wird funktionieren, für das, was es wert ist. Aber an diesem Punkt auch Sie können in erster Linie eine statische Methode aufrufen.

Ich bin mir nicht sicher, warum Ihr zweites Codebeispiel funktioniert nicht, aber wenn die erste Menge Code tut, was Sie wollen Sie einfach um es funktionieren könnten, indem Sie:

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

Sie müssen sowohl die ref und den this Modifikator auf dem Argumente, die Arbeit unwahrscheinlich scheint.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top