如何在处理中每 10 秒向变量添加 +1?
How to add +1 to variable every 10 seconds in Processing?
请原谅我的无知运行,但我 运行 遇到了一个问题,尽管这个想法很简单,但它对我目前使用 Processing 编程的知识来说是一个挑战。你看,我需要每 10 秒向变量添加 1 个单位。这是代码:
int i = 0;
void setup()
{
frameRate(60);
}
void draw()
{
int time = (millis() % 10000) / 1000;
if (time == 9)
{
i++;
} else {}
System.out.println("-------------------------------\n" +
"Timer: " + time + "\n"
+ "Adding 1 every 10 seconds: : " + i + "\n"
+ "-------------------------------");
}
问题在于,因为 draw()
每秒循环 60 次,一旦 time
达到 9,它最后一次使 if
语句执行 60 次并且它每 10 秒结束向 i
添加 60,我只需要添加 1.
我尝试应用某种算法来减去不必要的数字,如下所示:
int i = 1;
int toSubstract = 0; //Variable for algorithm
void setup()
{
frameRate(60);
}
void draw()
{
int time = (millis() % 10000) / 1000;
if (time == 9)
{
i++;
algToSubstract();
} else {}
System.out.println("-------------------------------\n" +
"Timer: " + time + "\n"
+ "Adding 1 every 10 seconds: : " + i + "\n"
+ "-------------------------------");
}
void algToSubstract() //<--- This is the algorithm
{
i = i - toSubstract;
toSubstract++;
if (toSubstract > 59)
{
toSubstract = 0;
} else {}
}
...但我无法让它工作。这个想法是这样的:
time
达到 9,if
语句执行,i
= 1 和 toSubstract
= 0.
i
增加 1 所以 i
= 2.
i = i - toSusbract
(i
= 2 - 0 所以 i
= 2)。
toSusbract
增加 1 所以 toSusbract
= 1.
i
增加 1 所以 i
= 3.
i = i - toSusbract
(i
= 3 - 1 所以 i
= 2)。
toSusbract
增加 1 所以 toSusbract
= 2.
...过程继续...
toSubstract
变得比 59 大,所以它重新启动到 0。
time
不再是 9。
您可以将最后的秒数存储在静态(或全局)变量中,并且仅在当前秒数高于 oldsecs
时递增 i
void draw() {
static int oldsecs = 0;
int secs = millis() / 1000;
if (secs > oldsecs) {
i++;
oldsecs = secs;
}
...
假设语言是C,int类型不溢出秒数
Ringo 有一个非常好的解决方案。
另一种可以轻松做到这一点的方法是:
bool addOnce = false;
void draw()
{
int time = (millis() % 10000) / 1000;
if (time == 9)
{
if(!addOnce) {
addOnce = true;
i++;
}
} else { addOnce = false; }
}
只要time == 9
,我们只会if(!addOnce)
一次。
改变后,我们重新设置标志。
其他答案是很好的通用方法,但它们没有利用 Processing 为您提供的功能。
例如,您可以使用 frameCount
变量来检查已经过去了多少帧。由于 draw()
每秒被调用 60 次,所以 10 秒就是 600 帧。像这样:
void draw(){
if(frameCount % 600 == 0){
// 10 seconds has elapsed
}
}
执行此操作的另一种方法是存储过去 10 秒的最后时间,然后对照当前时间检查该时间是否已过去 10 秒。像这样:
int previousTime = 0;
void draw(){
if(millis() > previousTime + 10*1000){
// 10 seconds has elapsed
previousTime = millis();
}
}
可以在 the reference 中找到更多信息。
请原谅我的无知运行,但我 运行 遇到了一个问题,尽管这个想法很简单,但它对我目前使用 Processing 编程的知识来说是一个挑战。你看,我需要每 10 秒向变量添加 1 个单位。这是代码:
int i = 0;
void setup()
{
frameRate(60);
}
void draw()
{
int time = (millis() % 10000) / 1000;
if (time == 9)
{
i++;
} else {}
System.out.println("-------------------------------\n" +
"Timer: " + time + "\n"
+ "Adding 1 every 10 seconds: : " + i + "\n"
+ "-------------------------------");
}
问题在于,因为 draw()
每秒循环 60 次,一旦 time
达到 9,它最后一次使 if
语句执行 60 次并且它每 10 秒结束向 i
添加 60,我只需要添加 1.
我尝试应用某种算法来减去不必要的数字,如下所示:
int i = 1;
int toSubstract = 0; //Variable for algorithm
void setup()
{
frameRate(60);
}
void draw()
{
int time = (millis() % 10000) / 1000;
if (time == 9)
{
i++;
algToSubstract();
} else {}
System.out.println("-------------------------------\n" +
"Timer: " + time + "\n"
+ "Adding 1 every 10 seconds: : " + i + "\n"
+ "-------------------------------");
}
void algToSubstract() //<--- This is the algorithm
{
i = i - toSubstract;
toSubstract++;
if (toSubstract > 59)
{
toSubstract = 0;
} else {}
}
...但我无法让它工作。这个想法是这样的:
time
达到 9,if
语句执行,i
= 1 和 toSubstract
= 0.
i
增加 1 所以 i
= 2.
i = i - toSusbract
(i
= 2 - 0 所以 i
= 2)。
toSusbract
增加 1 所以 toSusbract
= 1.
i
增加 1 所以 i
= 3.
i = i - toSusbract
(i
= 3 - 1 所以 i
= 2)。
toSusbract
增加 1 所以 toSusbract
= 2.
...过程继续...
toSubstract
变得比 59 大,所以它重新启动到 0。
time
不再是 9。
您可以将最后的秒数存储在静态(或全局)变量中,并且仅在当前秒数高于 oldsecs
i
void draw() {
static int oldsecs = 0;
int secs = millis() / 1000;
if (secs > oldsecs) {
i++;
oldsecs = secs;
}
...
假设语言是C,int类型不溢出秒数
Ringo 有一个非常好的解决方案。
另一种可以轻松做到这一点的方法是:
bool addOnce = false;
void draw()
{
int time = (millis() % 10000) / 1000;
if (time == 9)
{
if(!addOnce) {
addOnce = true;
i++;
}
} else { addOnce = false; }
}
只要time == 9
,我们只会if(!addOnce)
一次。
改变后,我们重新设置标志。
其他答案是很好的通用方法,但它们没有利用 Processing 为您提供的功能。
例如,您可以使用 frameCount
变量来检查已经过去了多少帧。由于 draw()
每秒被调用 60 次,所以 10 秒就是 600 帧。像这样:
void draw(){
if(frameCount % 600 == 0){
// 10 seconds has elapsed
}
}
执行此操作的另一种方法是存储过去 10 秒的最后时间,然后对照当前时间检查该时间是否已过去 10 秒。像这样:
int previousTime = 0;
void draw(){
if(millis() > previousTime + 10*1000){
// 10 seconds has elapsed
previousTime = millis();
}
}
可以在 the reference 中找到更多信息。