Уменьшение значения в векторах с SFML - PullRequest
2 голосов
/ 07 октября 2019

Я создал 5 чисел, используя вектор с SFML, но я хочу, чтобы второе падало одно за другим с интервалом в 1 секунду. Но они первые три падают как один за другим. Я не понимаю, почему происходит нечто подобное. Вы можете мне помочь?

if (second == 1)
    {

    random.at(2)-=1;
    cout << random[2] << endl;
    text.setString(to_string(random[2]));
    text.setPosition(numbers[2].getPosition().x, numbers[2].getPosition().y);
    numbers.push_back(text);
    numbers.erase(numbers.begin() + 2);
    clock.restart();


}

Программа GIF

Полный код

1 Ответ

0 голосов
/ 08 октября 2019

Я вам помогу.

Вот что происходит:

  1. Вы создаете 5 чисел в массиве random. Возможно, вы этого не заметили, но они пронумерованы от 0 до 4 (SFML находится на C ++, а это означает, что массивы начинаются здесь с нуля).
  2. Каждую секунду вы обновляете число, хранящееся в третьемместо вашего массива random.
  3. Тогда все пойдет не так: вместо обновления соответствующего числа в массиве numbers вы циклически изменяете его с помощью push_back и erase.

Поймите меня здесь: push_back создайте новый элемент в конце вектора, в то время как erase удаляет элемент из вектора и затем "сортирует вещи", чтобы в индексе вектора не было пробела.

По сути, вы правильно обрабатываете random, но когда вы пытаетесь обновить number, вы циклически обходите его. Например:

seconds:       1 2 3 4 5 6


array content: 0 0 0 0 0 0
  (vertical)   1 1 1 1 1 1
               2 3 4 5 6 7
               3 4 5 6 7 8
               4 5 6 7 8 9

Я не уверен, насколько ясно я делаю это, но если вы посмотрите на содержимое массива, вы увидите это, стерев и создав новое значение в конце,Вы перебираете позиции [2-4] массива. Вот почему в вашем gif обновляются не все числа, их всего 3.

Очевидным решением было бы прекратить стирание и толкание обратно в массив numbers. Вы можете обновить его так же, как вы обновили массив random. Все будет хорошо.

Вот так:

if (second == 1)
    {
    random.at(2)-=1;
    cout << random[2] << endl;
    numbers[2].setString(to_string(random[2]));
    clock.restart(); 
}

Веселитесь.

...