Pergunta

Eu tenho trabalhado com Vector2 de e XNA, e eu vim a descobrir que chamar a função de membro do Normalize () em um Vetor Zero normaliza-lo a um vector de {NaN, NaN}. Isto é tudo muito bem, mas no meu caso eu prefiro que ao invés de apenas deixá-los como Zero vetores.

Adicionando este código para o meu projeto ativado um método bonito extensão:

using ExtensionMethods;

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

Infelizmente, este método volta o vetor normalizado, em vez de simplesmente normalizar o vetor que eu uso para invocar esse método de extensão. Eu gostaria de se comportar em vez de vector2Instance .Normalize () faz.

Além de fazer esse vazio, como faço para ajustar isso para que o 'v2' é modificado? (Essencialmente, eu preciso de acesso ao 'esse' objeto, ou eu preciso 'v2' para serem passados ??por referência.)

Editar:

E sim, eu tentei isso:

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

não funciona, v2 é apenas uma variável no âmbito do NormalizeOrZero.

Foi útil?

Solução

Esta não funciona porque Vector 2 é na verdade, um struct . Isso significa que ele é passado por valor e você não pode modificar cópia do chamador. Eu acho que o melhor que você pode fazer é a solução especificada pela lomaxxx.

Isso ilustra por que você deve geralmente evitar o uso de estruturas. Consulte esta questão para obter mais informações. Vector2 viola a diretriz que estruturas devem ser imutáveis, mas provavelmente fez sentido para fazê-lo no contexto do XNA.

Outras dicas

Bem, se você é realmente apenas morrendo para fazer isso, você poderia fazer algo parecido com isto:

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

Você poderia chamá-lo desta maneira:

v2.NormalizeOrZero(ref v2);

É poderoso feio, mas ele vai trabalhar, por que vale a pena. Mas em que ponto você pode também chamar um método estático em primeiro lugar.

Eu não sei por que sua amostra segundo código não funciona, mas se o primeiro lote de código faz o que você quer você poderia simplesmente trabalhar em torno dele, indo:

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

Você precisaria tanto o ref eo modificador this no argumento, o que parece improvável ao trabalho.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top