Делайте это так, как вы загружаете свой уровень . Добавьте i++
в цикл while.
Редактировать
Хорошо, теперь я понимаю, что вы имеете в виду: один для уровня 1, два для уровня 2 и т. Д.
Ваш код в порядке и собирается делать то, что вы хотите, однако помещать его в метод рисования (или обновление) неправильно, так как эти методы выполняются часто.
То, что вы должны сделать, - это специальный метод , который загружает новый уровень . Вы можете вызвать этот метод, когда обнаружите, что уровень закончен и что он будет делать, это очистить ресурсы от предыдущего уровня (например, сбросить позиции игрока, жизни, боеприпасы и тому подобное). Тогда вы построите новый уровень - расстановка врагов и тому подобное, включая указанный вами код.
Надеюсь, я кое-что прояснил.
Вот прототип:
int _lives;
int _ammo;
List<Vector2> _positions;
Vector2 _playerPosition;
int _currentLevel;
void LoadLevel(int level)
{
_currentLevel = level;
_playerPosition = Vector2.Zero;
_lives = 3;
_ammo = 100;
List<Vector2> list = new List<Vector2>();
Random rnd = new Random();
int i = 0;
while(i < level)
{
list.Add(_positions[rnd.Next(0,10)]);
i++;
}
...
}
Тогда в вашем обновлении:
protected void Update(GameTime gameTime)
{
if(goToNextLevel) //here you put your condition that advances to next level;
{
LoadLevel(_currentLevel+1);
}
}
Edit2
Чтобы получить другой элемент из списка, которого у вас не было ранее, вы можете создать временный список , а затем удалить из него элементы вместо того, чтобы просто выбирать их.
Я не тестировал этот код, но он будет выглядеть примерно так:
List<Vector2> list = new List<Vector2>();
List<Vector2> tempList = new List<Vector2>(_positions);
Random rnd = new Random();
int i = 0;
while(i < level)
{
int index = rnd.Next(tempList.Count); //random goes up to number of items
list.Add(tempList[index]); //add the randomed item
tempList.RemoveAt(index); //remove the randomed item from the temporary list.
i++;
}
...