float x = 0;
void setup() {
size(200,200);
frameRate(60);
background(255);
}
int v = (int)random(0,width);
int b = (int)random(0,height);
void draw() {
drawCar(v,b,50,0);
secondDelay(5);
v = (int)random(0,width);
b = (int)random(0,height);
}
void drawCar(int x, int y, int thesize, int col) {
int offset = thesize/4;
//draw main car body
rectMode (CENTER);
stroke(200);
fill(col);
rect(x,y,thesize, thesize/2);
//draw wheel relative to car body center
fill(0);
rect(x-offset,y-offset,offset,offset/2);
rect(x+offset,y-offset,offset,offset/2);
rect(x+offset,y+offset,offset,offset/2);
rect(x-offset,y+offset,offset,offset/2);
}
void secondDelay(int aSecond){
int aS;
aS = aSecond * 60;
while(aS > 0) {
aS--;
}
}
我想做的是使
secondDelay()
函数作为延迟draw
函数(这是一个更新每一帧的循环)的方式来工作。而且frameRate本身是60,所以draw()
运行的速度是每秒60帧。通过将我想要的秒数作为
secondDelay(amountofseconds)
的参数来完成。然后在secondDelay()
函数中它将秒数乘以每秒的帧数(即60)。现在,我有了需要等待的帧数,并将其放入名为
aS
的变量中。然后,我在secondDelay()
函数中执行的操作是使while循环运行,每次它看到变量aS
大于0时运行。然后我每次从aS
循环时都减去1,直到不再大于0。那是您希望延迟的秒数被延迟,然后再次执行整个draw()
循环的时间。这就是我解释自己编写的代码的方式,但是它不起作用。相反,它只是像
secondDelay(5);
不存在一样在起作用,因此它只是在每帧中创建新车。我将如何解决这个问题?
最佳答案
对于您想做的事情,您必须计算帧数。如果帧数超过一个数字(等于延迟时间跨度),那么您就必须画一辆新车。
您不需要延迟,等待或睡眠一会儿的功能,但是您需要一个告诉并发出一段时间信号的功能。
创建一个全局帧计数器(frame_count
)并在secondDelay
函数中对帧进行计数。如果计数器超过60*aSecond
,则该功能会将计数器重置为0。如果计数器为0,则通过返回boolean
值为true来发出信号。
int frame_count = 0;
boolean secondDelay(int aSecond){
boolean signal = frame_count==0;
if ( frame_count >= 60*aSecond ) {
frame_count = 0;
} else {
frame_count ++;
}
return signal;
}
每当
secondDelay
返回true并给您信号时,您就必须在draw
函数中绘制新车:void draw() {
if ( secondDelay(5) ) {
drawCar(v,b,50,0);
v = (int)random(0,width);
b = (int)random(0,height);
}
}