如何在处理中使用回调函数?

时间:2013-02-16 18:09:36

标签: arrays arraylist processing

如何在一定时间后调用我的数组,以便以特定间隔创建一个对象。我希望我的数组每3秒创建一个球体。

Ball [] ball;

void setup()
{
  size(600,600,P3D);

  ball = new Ball[3];
  ball[0] = new Ball();
  ball[1] = new Ball();
  ball[2] = new Ball();
}

void draw()
{
  background(255);
  for (int i = 0; i < ball.length; i++) {
      ball[i].drawBall();
  }
}

class Ball
{
  float sphereSize = random(30, 90);
  float sphereX = random(-2200, 2800);
  float sphereY = 0;
  float sphereZ = random(-2200, 2800);

  void drawBall()
  {
    translate(sphereX, sphereY, sphereZ);
    sphere(sphereSize);
    sphereY +=1;
  }
}

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用millis()之类的计时功能将时间存储在变量中。

这个想法很简单:

  1. 存储上一次和延迟金额
  2. 持续跟踪时间
  3. 如果当前时间比先前存储的时间和延迟时间更长,那么延迟时间间隔已经过去。
  4. 这是一个简单的草图来说明这个想法:

        int now,delay = 1000;
        void setup(){
          now = millis();
        }
        void draw(){
          if(millis() >= (now+delay)){//if the interval passed
            //do something cool here
            println((int)(frameCount/frameRate)%2==1 ? "tick":"tock");
            background((int)(frameCount/frameRate)%2==1 ? 0 : 255);
            //finally update the previously store time
            now = millis();
          }
        }
    

    并与您的代码集成:

    int ballsAdded = 0;
    int ballsTotal = 10;
    Ball [] ball;
    
    int now,delay = 1500;
    
    void setup()
    {
      size(600,600,P3D);sphereDetail(6);noStroke();
      ball = new Ball[ballsTotal];
      now = millis();
    }
    
    void draw()
    {
      //update based on time
      if(millis() >= (now+delay)){//if the current time is greater than the previous time+the delay, the delay has passed, therefore update at that interval
        if(ballsAdded < ballsTotal) {
          ball[ballsAdded] = new Ball();
          ballsAdded++;
          println("added new ball: " + ballsAdded +"/"+ballsTotal);
        }
        now = millis();
      }
      //render
      background(255);
      lights();
      //quick'n'dirty scene rotation
      translate(width * .5, height * .5, -1000);
      rotateX(map(mouseY,0,height,-PI,PI));
      rotateY(map(mouseX,0,width,PI,-PI));
      //finally draw the spheres
      for (int i = 0; i < ballsAdded; i++) {
          fill(map(i,0,ballsAdded,0,255));//visual cue to sphere's 'age'
          ball[i].drawBall();
      }
    }
    
    class Ball
    {
      float sphereSize = random(30, 90);
      float sphereX = random(-2200, 2800);
      float sphereY = 0;
      float sphereZ = random(-2200, 2800);
    
      void drawBall()
      {
        pushMatrix();
        translate(sphereX, sphereY, sphereZ);
        sphere(sphereSize);
        sphereY +=1;
        popMatrix();
      }
    }