2013-02-16 44 views
0

如何在一段时间后调用我的数组,以便在特定时间间隔内创建对象。我希望我的数组每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

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

的想法很简单:

  1. 商店以前的时间和延迟的时间不断
  2. 跟踪如果当前时间比以前存储的时间和延迟greather,然后延迟时间间隔已经过去。

这里有一个简单的草图来说明这个想法:

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(); 
    } 
} 
+0

感谢您抽出宝贵的时间来做到这一点。这正是我需要的。 – 2013-02-17 00:06:36

+0

不用担心你的项目和善良! :) – 2013-02-17 00:16:05