如何在处理 3.4 中使用 java 创建自定义延迟函数?
how do I make a custom delay function with java in processing 3.4?
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,所以每秒 60 帧是 draw()
是 运行。
这是通过将我想要的秒数作为 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
returns true 等给你信号时,你就得在 draw
函数中画一辆新车:
void draw() {
if ( secondDelay(5) ) {
drawCar(v,b,50,0);
v = (int)random(0,width);
b = (int)random(0,height);
}
}
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,所以每秒 60 帧是 draw()
是 运行。
这是通过将我想要的秒数作为 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
returns true 等给你信号时,你就得在 draw
函数中画一辆新车:
void draw() {
if ( secondDelay(5) ) {
drawCar(v,b,50,0);
v = (int)random(0,width);
b = (int)random(0,height);
}
}