如何在处理中每 10 秒向变量添加 +1?

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

请原谅我的无知运行,但我 运行 遇到了一个问题,尽管这个想法很简单,但它对我目前使用 Processing 编程的知识来说是一个挑战。你看,我需要每 10 秒向变量添加 1 个单位。这是代码:

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 次并且它每 10 秒结束向 i 添加 60,我只需要添加 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 - toSusbracti = 2 - 0 所以 i = 2)。

toSusbract 增加 1 所以 toSusbract = 1.

i 增加 1 所以 i = 3.

i = i - toSusbracti = 3 - 1 所以 i = 2)。

toSusbract 增加 1 所以 toSusbract = 2.

...过程继续...

toSubstract 变得比 59 大,所以它重新启动到 0。

time 不再是 9。

您可以将最后的秒数存储在静态(或全局)变量中,并且仅在当前秒数高于 oldsecs

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

假设语言是C,int类型不溢出秒数

Ringo 有一个非常好的解决方案。

另一种可以轻松做到这一点的方法是:

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)一次。

改变后,我们重新设置标志。

其他答案是很好的通用方法,但它们没有利用 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();
   }
}

可以在 the reference 中找到更多信息。