Как нарисовать только один раз за уровень позиции и проверить, являются ли позиции уникальными? - PullRequest
0 голосов
/ 30 января 2012

Как и в заголовке, я хочу получить позицию из List<Vector2> positions = new List<Vector2>{/*here i got 9 vectors*/} и хочу получить только некоторые из них.

например, на 1-м уровне я хочу случайную проверку только 1 позиции из этого списка в 22-я позиция уровня 2 и так далее ...

//making that in switch statement where i check which level user actually is
Random rnd = new Random();
List<Vector2> list = new List<Vector2>();
byte i = 0;
byte level; // number from 0 to 9 changing where level complited;
while(i < level){
      list.Add(positions[rnd.Next(0,10)]);
      i++;
 }

проблема, которая у меня есть, состоит в том, как случайным образом расположить эту позицию только по единицам на уровень, теперь я получил это случайным образом, но оно постоянно менялось.Я делаю это в методе розыгрыша.

где я должен разыграть эти позиции?в методе обновления или где-то еще?

Редактировать: случайная проверка означает, что я хочу получить только 1 Vector2 из моего списка, но с использованием случайного класса для рандомизации каждого уровня теперь ясно?Я не знаю, как проще я могу это объяснить: (

Edit1:

и как предотвратить получение той же позиции из списка, я имею в виду, как проверить, если этоВектор2 из моего списка нарисованы или нет (уникальны).

спасибо за продвижение:)

1 Ответ

1 голос
/ 30 января 2012

Делайте это так, как вы загружаете свой уровень . Добавьте 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++;
    }
    ...
...