O programa 'for loop' está alterando vários valores na matriz em uma instância
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();
}
}
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();
}