最简单的方法是使用类似millis()的计时函数将时间存储在变量中。
这个想法很简单:
- 存储先前的时间和延迟量
- 持续跟踪时间
- 如果当前时间大于先前存储的时间和延迟,则该延迟间隔已经过去。
这是一个简单的草图来说明这个想法:
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();
}
}