我在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();
}
}
答案 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;
}
或者sprite
或position
可能是静态字段:
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();
}