程序'for loop'在一个实例中改变数组中的多个值

时间:2014-06-02 22:17:51

标签: c# loops for-loop directx direct2d

我在Express 2010 visual c#中的调试器选项(红点)中逐行工作。 当我等于2时,这个循环将生物[2] .sprite.position和creatures [3] .sprite.position分配给相同实例的相同向量(100,320)。

进一步的测试表明,当i = 3时会发生相同的情况,然后在i = 4时,所有2,3和4同时被改变为相同的向量。

任何关于造成这种情况的建议,感觉就像一个错误,现在想着它,我应该尝试一个与我不同的变量,也许它被用在其他地方。

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();    
        }
    }

1 个答案:

答案 0 :(得分:2)

这是因为您可能已初始化所有数组元素以指向单个实例:

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

或许您创造了多个生物,但使用相同的&#34;精灵&#34;:

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

或者spriteposition可能是静态字段:

static Sprite sprite;
//or
static Vector2 position;

以上所有都会导致你所有的突变和访问都发生在同一个实例中,所以看起来改变一个正在改变所有这些(实际上只有一个生物/精灵/位置,你可以“#”;从多个地方重新参考)。

解决方案是确保字段不是静态的,并确保为每个字段创建一个新生物和creature.sprite:

// 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();
}