How to add +1 to variable every 10 seconds in Processing?

我怕爱的太早我们不能终老 提交于 2019-12-17 17:28:11

问题


Excuse my ignorance, but I ran into a problem that turned out to be challenging for my current knowledge in programming with Processing, even though the idea is quite simple. You see, I need to add 1 unit to a variable every 10 seconds. This is the code:

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"
                   + "-------------------------------");
}

The problem is that because draw() loops 60 times per second, as soon as time reaches 9 the second it last makes the if statement to be executed 60 times and it ends adding 60 to i every 10 seconds and I just need to be adding 1.

I tried to apply some kind of algorithm that subtracts the unnecessary numbers as they increase like so:

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 {}
}

...but I couldn't make it work. The idea was something like this:

time reaches 9, if statement executes, i = 1 and toSubstract = 0.

i increases 1 so i = 2.

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

toSusbract increases 1 so toSusbract = 1.

i increases 1 so i = 3.

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

toSusbract increases 1 so toSusbract = 2.

... Process continues...

toSubstract gets bigger than 59 so it is restarted to 0.

time stops being 9.


回答1:


Ringo has a solution that's perfectly fine.

Another way you can do this easily is:

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

As long as time == 9, we'll only get through if(!addOnce) one time.

After it changes, we reset the flag.




回答2:


The other answers are fine general approaches, but they don't take advantage of the features that Processing provides for you.

For example, you could use the frameCount variable to check how many frames have elapsed. Since draw() is called 60 times per second, 10 seconds is 600 frames. Something like this:

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

Another way to do this is to store the last time 10 seconds elapsed, and then check that against the current time to see if 10 seconds has elapsed since then. Something like this:

int previousTime = 0;

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

More info can be found in the reference.




回答3:


You could store the last number of seconds in a static (or global) variable, and only increment i when the current number of seconds is higher than the oldsecs

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

Assuming the language is C, and the int type is not overflowed by the number of seconds.



来源:https://stackoverflow.com/questions/46270306/how-to-add-1-to-variable-every-10-seconds-in-processing

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!