如何在Processing中每10秒为变量添加+1?

时间:2017-09-18 01:12:12

标签: processing milliseconds

请原谅我的无知,但是我遇到了一个问题,这个问题对我目前在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秒60到i,我只需要添加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。

3 个答案:

答案 0 :(得分:1)

其他答案是很好的一般方法,但它们没有利用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找到更多信息。

答案 1 :(得分:0)

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

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

假设语言为C,并且 int 类型没有溢出秒数。

答案 2 :(得分:0)

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)

更改后,我们重置标志。