请原谅我的无知,但是我遇到了一个问题,这个问题对我目前在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秒60到i
,我只需要添加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。
答案 0 :(得分:1)
其他答案是很好的一般方法,但它们没有利用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找到更多信息。
答案 1 :(得分:0)
您可以将最后一个秒数存储在静态(或全局)变量中,并且仅在当前秒数高于i
oldsecs
void draw() {
static int oldsecs = 0;
int secs = millis() / 1000;
if (secs > oldsecs) {
i++;
oldsecs = secs;
}
...
假设语言为C,并且 int 类型没有溢出秒数。
答案 2 :(得分:0)
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)
。
更改后,我们重置标志。