РЕДАКТИРОВАТЬ: Просто понял, что это спросили несколько месяцев назад. OOPS. Хотя я оставлю свой ответ, если кто-нибудь найдет его полезным.
Хорошо, насколько я могу судить, ваша проблема заключается в вашем UpdateProjectiles()
коде. В частности, по адресу:
//if projectiles not being fired remove them from the game screen
else
{
projectiles.RemoveAt(i);
}
Это означает, что когда вы не нажмете пробел, вы удалите все снаряды из списка. Кроме того, в вашем коде розыгрыша вы звоните UpdateProjectiles()
, особенно когда отпускается пробел, который очистит ваш список снарядов.
То, что вы могли бы сделать, это вместо того, чтобы позволить пробелу контролировать, если показываются снаряды, управлять этим отдельно. Я имею в виду что-то вроде этого:
//adds projectiles - only if the spacebar was pressed this update,
//ensuring that only ONE projectile is added per press:
if (currentKeyboardState.IsKeyDown(Keys.Space) && previousKeyboardState.IsKeyUp(Keys.Space))
{
projectiles.Add(new Projectile());
}
//updates the projectiles:
for(int i = 0; i < projectiles.Count; ++i)
{
projectiles[i].Update();
}
//checks if projectiles have collided or are out of bounds:
foreach(projectile p in projectiles)
{
if (PROJECTILE IS OUT OF BOUNDS || HAVE COLLIDED WITH STUFF)
{
DO WHAT NEEDS TO BE DONE;
projectiles.Remove(p);
break;
}
}
Как видите, единственное, что здесь делает пробел, - это добавление новых снарядов при нажатии. Обновление и удаление снарядов происходит независимо от того, нажата ли клавиша пробела.
Также в вашем коде рисования я бы порекомендовал изменить его на просто:
//draws the projectiles regardless of whether the spacebar is pressed
foreach (projectile p in projectiles)
{
p.Draw(spriteBatch);
}
Это означает, что вы будете рисовать все снаряды в списке (или ни одного, если он пуст), независимо от того, нажата пробел или нет. Я также рекомендовал бы перемещать UpdateProjectiles()
, чтобы быть только в вашем вызове Update()
, так как это освобождает ваши методы рисования, чтобы просто заниматься рисованием.
Я не утверждаю, что это самый эффективный способ сделать это, но он выполнит свою работу. Однако следует отметить, что вы сможете удалить только 1 снаряд за вызов UpdateProjectiles()
, но это не должно быть проблемой (по крайней мере, по моему опыту), поскольку вы обновляете много раз во-вторых, и редко будут удаляться два снаряда в одном обновлении.
Надеюсь, это поможет:)