Как добавлять +1 к переменной каждые 10 секунд в Processing?

Простите мое невежество, но я столкнулся с проблемой, которая оказалась сложной для моих нынешних знаний в области программирования с Processing, хотя идея довольно проста. Видите ли, мне нужно добавлять 1 единицу к переменной каждые 10 секунд. Это код:

int i = 0;

void setup()
{
  frameRate(60);
}

void draw()
{

  int time = (millis() % 10000) / 1000;

  if (time == 9)
  {
    i++;
  } else {}

  System.out.println("-------------------------------\n" +
                     "Timer: " + time + "\n"
                   + "Adding 1 every 10 seconds: : " + i + "\n"
                   + "-------------------------------");
}

Проблема в том, что, поскольку draw() зацикливается 60 раз в секунду, как только time достигает 9, последняя секунда заставляет оператор if выполняться 60 раз, и он заканчивает добавлением 60 к i каждые 10 секунд, и мне просто нужно добавить 1.

Я попытался применить какой-то алгоритм, который вычитает ненужные числа по мере их увеличения:

int i = 1;
int toSubstract = 0; //Variable for algorithm

void setup()
{
  frameRate(60);
}

void draw()
{

  int time = (millis() % 10000) / 1000;

  if (time == 9)
  {
    i++;
    algToSubstract();
  } else {}



  System.out.println("-------------------------------\n" +
                     "Timer: " + time + "\n"
                   + "Adding 1 every 10 seconds: : " + i + "\n"
                   + "-------------------------------");
}

void algToSubstract() //<--- This is the algorithm
{
  i = i - toSubstract;
  toSubstract++;

  if (toSubstract > 59)
  {
    toSubstract = 0;
  } else {}
}

... но я не мог заставить его работать. Идея была примерно такой:

time достигает 9, выполняется оператор if, i = 1 и toSubstract = 0.

i увеличивает 1, поэтому i = 2.

i = i - toSusbract (i = 2 - 0 so i = 2).

toSusbract увеличивает 1, поэтому toSusbract = 1.

i увеличивает 1, поэтому i = 3.

i = i - toSusbract (i = 3 - 1 so i = 2).

toSusbract увеличивает 1, поэтому toSusbract = 2.

...Процесс продолжается...

toSubstract становится больше 59, поэтому он перезапускается до 0.

time перестает быть 9.


person Lambientan    schedule 18.09.2017    source источник


Ответы (3)


У Ринго есть прекрасное решение.

Другой способ сделать это легко:

bool addOnce = false;
void draw()
{
  int time = (millis() % 10000) / 1000;
  if (time == 9)
  {
      if(!addOnce) {
          addOnce = true;
          i++;
      }
  } else { addOnce = false; }
}

Пока time == 9, мы пройдем через if(!addOnce) только один раз.

После его изменения сбрасываем флаг.

person user1274820    schedule 18.09.2017

Другие ответы представляют собой прекрасные общие подходы, но они не используют возможности, которые предоставляет вам Processing.

Например, вы можете использовать переменную frameCount, чтобы проверить, сколько кадров прошло. Поскольку draw() вызывается 60 раз в секунду, 10 секунд — это 600 кадров. Что-то вроде этого:

void draw(){
  if(frameCount % 600 == 0){
    // 10 seconds has elapsed
  }
}

Другой способ сделать это — сохранить время последнего прошедшего времени в 10 секунд, а затем сравнить его с текущим временем, чтобы узнать, прошло ли с тех пор 10 секунд. Что-то вроде этого:

int previousTime = 0;

void draw(){
   if(millis() > previousTime + 10*1000){
      // 10 seconds has elapsed
      previousTime = millis();
   }
}

Дополнительную информацию можно найти в справке.

person Kevin Workman    schedule 18.09.2017

Вы можете сохранить последнее количество секунд в статической (или глобальной) переменной и увеличивать i только тогда, когда текущее количество секунд больше, чем oldsecs

void draw() {
    static int oldsecs = 0;
    int secs = millis() / 1000;
    if (secs > oldsecs) {
        i++;
        oldsecs = secs;
    }
    ...

Предположим, что используется язык C, а тип int не переполняется количеством секунд.

person Breaking not so bad    schedule 18.09.2017
comment
Язык находится в обработке. Обратите внимание на тег processing. - person Kevin Workman; 18.09.2017