2017-09-18 4 views
0

Entschuldigen Sie meine Ignoranz, aber ich stieß auf ein Problem, das für mein aktuelles Wissen in der Programmierung mit Processing herausforderte, obwohl die Idee ziemlich einfach ist. Sie sehen, ich muss alle 10 Sekunden eine Einheit zu einer Variablen hinzufügen. Dies ist der Code:Wie fügt man in der Verarbeitung alle 10 Sekunden + 1 zur Variablen hinzu?

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

Das Problem ist, dass, weil draw() 60 mal pro Sekunde Schleifen, sobald time erreicht 9 die zweite er zuletzt die if Aussage macht 60-mal ausgeführt werden, und es endet 60 Hinzufügen alle 10 Sekunden zu i und ich brauche nur 1.

Zugabe zu ich habe versucht, eine Art von Algorithmus anzuwenden, die die unnötigen Zahlen subtrahiert, da sie wie so erhöhen:

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 {} 
} 

... aber ich konnte es nicht funktionieren lassen. Die Idee war, etwas wie folgt aus:

time erreicht 9, if Anweisung ausführt, i = 1 und toSubstract = 0.

i steigt 1 so i = 2.

i = i - toSusbract (i = 2 - 0 also i = 2).

toSusbract steigt 1 so toSusbract = 1.

i steigt 1 so i = 3.

i = i - toSusbract (i = 3 - 1 so i = 2).

toSusbract steigt 1 so toSusbract = 2.

... Prozess wird fortgesetzt, ...

toSubstract wird größer als 59, so wird es

time Anschläge auf 0 eingestellt sein 9.

Antwort

0

Ringo hat eine Lösung, die vollkommen in Ordnung ist.

Eine weitere Möglichkeit, dies leicht tun können:

bool addOnce = false; 
void draw() 
{ 
    int time = (millis() % 10000)/1000; 
    if (time == 9) 
    { 
     if(!addOnce) { 
      addOnce = true; 
      i++; 
     } 
    } else { addOnce = false; } 
} 

Solange time == 9, werden wir nur durch if(!addOnce) auf einmal bekommen.

Nachdem es sich geändert hat, setzen wir das Flag zurück.

0

Sie können die letzte Anzahl von Sekunden in einer statischen (oder globalen) Variablen speichern und nur i inkrementieren, wenn die aktuelle Anzahl an Sekunden höher ist als die oldsecs

void draw() { 
    static int oldsecs = 0; 
    int secs = millis()/1000; 
    if (secs > oldsecs) { 
     i++; 
     oldsecs = secs; 
    } 
    ... 

die Sprache Unter der Annahme, C, und der int Typ wird durch die Anzahl von Sekunden nicht überschwemmt.

+0

Die Sprache wird verarbeitet. Beachten Sie das Tag [tag: processing]. –

0

Die anderen Antworten sind gute allgemeine Ansätze, aber sie nutzen nicht die Funktionen, die die Verarbeitung für Sie bietet.

Zum Beispiel könnten Sie die Variable frameCount verwenden, um zu überprüfen, wie viele Frames abgelaufen sind. Da draw() 60 Mal pro Sekunde aufgerufen wird, sind 10 Sekunden 600 Frames. Etwas wie folgt aus:

void draw(){ 
    if(frameCount % 600 == 0){ 
    // 10 seconds has elapsed 
    } 
} 

Ein anderer Weg, dies zu tun, ist das letzte Mal 10 Sekunden verstrichen ist, zu speichern und dann prüfen, ob gegen den Strom der Zeit zu sehen, ob 10 Sekunden seitdem verstrichen ist. Etwas wie folgt aus:

int previousTime = 0; 

void draw(){ 
    if(millis() > previousTime + 10*1000){ 
     // 10 seconds has elapsed 
     previousTime = millis(); 
    } 
} 

Weitere Informationen finden Sie in the reference finden.

Verwandte Themen