【问题标题】:Removing list items in C# / XNA删除 C# / XNA 中的列表项
【发布时间】:2013-06-26 10:54:44
【问题描述】:

我是 XNA Game Studios 的初学者,想学习一些游戏编程的基础知识。 我目前正在创建一个小型太空射击游戏,类似于 Space Invaders 的变体。

为了让我的火箭看起来更好看,我创建了一些烟雾轨迹来跟踪它们,但想在一段时间(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);
    }
}

Particle 是我创建的一个类,目的是获得列表项(代表烟雾粒子)的创建时间及其位置 Vector2。

但是,它并没有从下到上删除烟雾轨迹,而是停在两者之间,如下图所示:

我希望有人可以帮助我编写代码。

【问题讨论】:

    标签: c# arrays xna synchronization particles


    【解决方案1】:

    因此,从迭代列表中删除一个项目会减少计数:

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

    【讨论】:

    • 不幸的是,这也不起作用。还是一样的问题。
    • 你是不是叫烟消完后重绘?
    • 我确实调用了 Draw 方法。烟雾是在 foreach 循环中绘制的,这意味着不会绘制已删除的数组索引。所以我想他们甚至没有正确地从数组中删除。
    • 您需要在 'if' 条件上添加断点并单步执行以查看项目是否已从列表中删除。
    • 有些粒子会从列表中删除,有些则不会。我不知道为什么,根据我对自己代码的理解,它应该可以工作。如果有人可以发布他如何使这成为可能,那就太好了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-12
    • 2022-01-12
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多