1

一定時間後に配列を呼び出して、特定の間隔でオブジェクトを作成するにはどうすればよいですか。アレイで 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;
  }
}
4

1 に答える 1

2

最も簡単な方法は、 millis()のような時間管理関数を使用して変数に時間を格納することです。

アイデアは簡単です:

  1. 前の時間と遅延量を保存する
  2. 継続的に時間を追跡する
  3. 現在の時間が以前に保存された時間と遅延よりも大きい場合、その遅延間隔は過ぎています。

アイデアを説明するための簡単なスケッチを次に示します。

    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();
  }
}
于 2013-02-16T22:12:45.583 に答える