Domanda

Ho lavorato con Vector2 e XNA e ho scoperto che chiamare la funzione membro Normalize () su Zero Vector la normalizza su un vettore di {NaN, NaN}. Va tutto bene, ma nel mio caso preferirei invece lasciarli come Vettori Zero.

L'aggiunta di questo codice al mio progetto ha abilitato un metodo di estensione carino:

using ExtensionMethods;

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

Sfortunatamente, questo metodo restituisce il vettore normalizzato, piuttosto che semplicemente normalizzare il vettore che uso per invocare questo metodo di estensione. Vorrei invece comportarmi come vector2Instance .Normalize ().

Oltre a rendere questo vuoto, come posso regolarlo in modo che la 'v2' sia modificata? (Fondamentalmente, ho bisogno di accedere all'oggetto 'this', oppure ho bisogno di passare 'v2' per riferimento.)

Modifica:

E sì, ho provato questo:

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

Non funziona, v2 è solo una variabile nell'ambito di NormalizeOrZero.

È stato utile?

Soluzione

Questo non funziona perché Vector 2 è in realtà una struttura . Ciò significa che viene passato per valore e non è possibile modificare la copia del chiamante. Penso che il meglio che puoi fare sia la soluzione specificata da lomaxxx.

Questo illustra perché dovresti generalmente evitare di usare le strutture. Vedi questa domanda per ulteriori informazioni. Vector2 viola le linee guida secondo cui le strutture dovrebbero essere immutabili, ma probabilmente ha senso farlo nel contesto di XNA.

Altri suggerimenti

Bene, se davvero stai morendo per farlo, potresti fare qualcosa del genere:

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

Lo chiameresti così:

v2.NormalizeOrZero(ref v2);

È molto brutto, ma funzionerà, per quello che vale. Ma a quel punto puoi anche chiamare un metodo statico in primo luogo.

Non sono sicuro del motivo per cui il tuo secondo esempio di codice non funziona, ma se il primo lotto di codice fa quello che desideri, puoi semplicemente aggirare andando:

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

Avresti bisogno sia del ref che del this sull'argomento, che sembra improbabile che funzioni.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top