2012-06-06 13 views
5

Zajmuję się tworzeniem aplikacji przy użyciu Processing.js.Processing.js timer

Na każdym kroku w pętli rysowania zwiększam liczbę klatek o jeden frame++.

Chcę wiedzieć, ile czasu minęło. Obecnie, aby uzyskać czas upływający (wiedząc, że moja aplikacja jest uruchomiona na 60FPS), podoba mi się: time=frame/60. Ale działa to tylko wtedy, gdy aplikacja zawsze działa dokładnie w FPS i wszyscy wiemy, że tak nie jest, ponieważ zależy to od sprzętu użytkownika.

Chcę, aby timer był dość dokładny (mając tylko błąd 0,0001 s).

Sugerowanie algorytmu javascript do obliczania różnicy między teraz() i start_time() jest również mile widziane.

Odpowiedz

2

Możesz zapisać czas rozpoczęcia w zmiennej.

Następnie należy utworzyć nowy timer kiedy chcesz i odejmowanie zmienną czasową początek od niego .. Rezultatem będzie różnica w milisekundach ..

Można również korzystać z czasu rzeczywistego podzielona przez licznik do klatek uzyskać dokładną średnią szybkością klatek aplikacji ..

coś podobnego

var startTimer = new Date(); // at start (once) 

i kiedykolwiek chcesz sprawdzić

var passed = new Date() - startTimer; // in milliseconds 

Demo na http://jsfiddle.net/gaby/CF4Ju/

3

Jeśli chcesz dokładność, spojrzeć w high resolution timers. Ta funkcja nie jest jednak dostępna we wszystkich przeglądarkach.

Ponadto Processing.js ma wbudowaną zmienną tylko do odczytu o nazwie frameCount. Możesz zapytać o to, zamiast samodzielnie zliczać ramki.

0

Wymyśliłem tę klasę w grze. Wykorzystuje millis() i jest niezależna od frameRate

class Timer{ 
    boolean increment, inProgress; 
    int spawn, end; 
    int seconds, tm_limit; 

    Timer(int tm_limit){ 
    this.tm_limit = tm_limit; 
    seconds = tm_limit; 
    increment = false; 
    inProgress = false; 
    } 

    Timer(){ 
    seconds = 0; 
    increment = true; 
    inProgress = false; 
    } 

    void start(){ 
    inProgress = true; 
    spawn = millis(); 
    } 

    void stop(){ 
    inProgress = false; 
    end = millis(); 
    } 

    int getSeconds(){ 
    if(inProgress){ 
     if(increment){ 
     seconds = int((millis() - spawn)/1000); 
     } 
     else{ 
     if(seconds - int((millis() - spawn)/1000) != seconds){ 
      seconds = seconds - int((millis() - spawn)/1000); 
      if(seconds <= 0) { stop(); } 
      else spawn = millis(); 
     } 
     } 
    } 
    return seconds; 
    } 

    void reset(){ 
    if(!increment) 
     seconds = tm_limit; 
    else 
     seconds = 0; 

    inProgress = false; 
    } 
} 

Jeśli obiekt Timer jest tworzony z parametrem, to zakłada się, że czasowy powinien maleć. W przeciwnym razie warunek wyjścia można sprawdzić, pobierając wartość z metody getSeconds().