2013-06-26 2 views
1

Я начинаю с XNA Game Studios и хочу узнать некоторые основы программирования игр. В настоящее время я создаю небольшой космический шутер, что-то вроде вариации Space Invaders.Удаление элементов списка в C#/XNA

Чтобы мои ракеты выглядели лучше, я создал несколько дымовых дорожек, чтобы следить за ними, но хотел бы удалить их через некоторое время (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

Я надеюсь, что кто-то может помочь мне с моим кодом.

ответ

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

К сожалению, это не работает. Это все та же проблема. – Padarom

+0

Вы называете перекраску после удаления дыма? – Jegan

+0

Я вызываю метод Draw. Дым втягивается в цикл foreach, что означает, что удаленные индексы массива не раскрашены. Поэтому я полагаю, что они даже не удалены из массива. – Padarom