Pergunta

Eu estava trabalhando linha por linha na opção de depurador (ponto vermelho) no Express 2010 visual c#.Este loop estava atribuindo criaturas[2].sprite.position e criaturas[3].sprite.position ao mesmo vetor (100.320) na mesma instância, quando igualei 2.

Testes adicionais mostraram que quando i = 3 o mesmo aconteceria, então em i = 4, todos os 2,3 e 4 foram alterados ao mesmo tempo para o mesmo vetor.

alguma sugestão sobre o que está causando isso, parece um bug, pensando nisso agora, eu deveria tentar uma variável diferente da i, talvez ela esteja sendo usada em algum outro lugar.

public class GameImages
    {
        //Image Diminsions
        public Texture2D texture;
        //Images position on the Viewport
        public Vector2 position = new Vector2(0,0);
        //Color
        public Microsoft.Xna.Framework.Color color = Microsoft.Xna.Framework.Color.White;
    }

 public class CreaturesAttributes
    {
        //Image
        public GameImages sprite;
        //Level
        public double Level;
    }

CreaturesAttributes[] creatures = new CreaturesAttributes[100];


public void LoadTeam()
    {
        int j = 0;
        for (int i = 1; i < creatures.Length; i++)
        {

            if (creatures[i].Color1 != null)
            {
                creatures[i].sprite.position = new Vector2(j, 320);
                j += 100;

            }
            else
            {
                i = creatures.Length;
            }
        }
    }
    protected override void Initialize()
    {
        for (int i = 0; i < creatures.Length; i++)
        {
            creatures[i] = new CreaturesAttributes();
            creatures[i].sprite = new GameImages();    
        }
    }
Foi útil?

Solução

Isso acontece porque você provavelmente inicializou todos os elementos do seu array para apontar para uma única instância:

var newCreature = new Creature(/* ... */);
for (int i = 0; i < creatures.Length; i++) {
  creatures[i] = newCreature;
}

Ou talvez você tenha criado múltiplas criaturas, mas com o mesmo “sprite”:

var defaultSprite = new Sprite(/* ... */);
for (int i = 0; i < creatures.Length; i++) {
  creatures[i] = new Creature();
  creatures[i].sprite = defaultSprite;
}

ou talvez sprite ou position são campos estáticos:

static Sprite sprite;
//or
static Vector2 position;

Tudo o que foi dito acima fará com que todas as suas mutações e acessos aconteçam na mesma instância, então parece que mudar um está mudando todos eles (embora na realidade haja apenas uma única criatura/sprite/posição que você está referenciando de vários lugares ).

A solução é garantir que os campos não sejam estáticos e criar uma nova criatura e criatura.sprite para cada um:

// No static fields, and new instances for each index
for (int i = 0; i < creatures.Length; i++) {
  creatures[i] = new Creature();
  creatures[i].sprite = new Sprite();
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top