删除C#/ XNA中的列表项

时间:2013-06-26 10:54:45

标签: c# arrays xna synchronization particles

我是XNA Game Studios的初学者,想学习一些游戏编程的基础知识。 我目前正在创造一个小型太空射击游戏,就像太空侵略者的变种。

为了让我的火箭看起来更好,我创造了一些烟雾跟踪它们,但是想要在一段时间后(400毫秒)将它们移除,这样屏幕就不会被烟雾阻挡。 为了达到这个目的,我创建了以下代码,这对我来说似乎很合乎逻辑。

for(int i=0; i < rocketPosition.Count; i++)
{
    rocketPosition[i] = new Vector2(rocketPosition[i].X, rocketPosition[i].Y - rocketSpeed);
    Vector2 smokePosition = rocketPosition[i];
    smokePosition.X += Rocket.Width / 2 + smokeTexture.Width / 2 + randomizer.Next(10) - 5;
    smokePosition.Y += Rocket.Height + randomizer.Next(10) - 5;
    smokeList.Add(new Particle(smokePosition, gameTime.TotalGameTime.Milliseconds));
    if (rocketPosition[i].Y < 0 - Rocket.Height)
    {
        rocketPosition.RemoveAt(i);
    }
}

for(int i = 0; i < smokeList.Count; i++)
{
    if (smokeList[i].Time < gameTime.TotalGameTime.Milliseconds - smokeDuration)
    {
        smokeList.RemoveAt(i);
    }
}

粒子是我创建的一个类,它既有列表项的创建时间(代表烟雾粒子),也有它的位置Vector2。

然而,它不是从底部到顶部删除烟雾痕迹,而是在两者之间停止,如下图所示: Smoke trail with holes in between

我希望有人可以帮我处理我的代码。

1 个答案:

答案 0 :(得分:0)

从迭代列表中删除项目会减少计数:

for(int i=rocketPosition.Count; i > 0 ; i--)
{
   rocketPosition[i] = new Vector2(rocketPosition[i].X, rocketPosition[i].Y - rocketSpeed);
   Vector2 smokePosition = rocketPosition[i];
   smokePosition.X += Rocket.Width / 2 + smokeTexture.Width / 2 + randomizer.Next(10) - 5;
   smokePosition.Y += Rocket.Height + randomizer.Next(10) - 5;
   smokeList.Add(new Particle(smokePosition, gameTime.TotalGameTime.Milliseconds));
   if (rocketPosition[i].Y < 0 - Rocket.Height)
   {
       rocketPosition.RemoveAt(i);
   }
}

for(int i = smokeList.Count; i  > 0 ; i--)
{
   if (smokeList[i].Time < gameTime.TotalGameTime.Milliseconds - smokeDuration)
   {
       smokeList.RemoveAt(i);
   }
}