2012-06-06 5 views
5

Je développe une application en utilisant Processing.js.Processing.js timer

À chaque étape de la boucle de dessin, j'augmente le nombre de trames de frame++.

Je veux savoir combien de temps s'est écoulé. Actuellement, pour faire passer le temps (sachant que mon application est configurée pour fonctionner sur 60FPS), j'aime bien: time=frame/60. Mais cela ne fonctionne que si l'application tourne toujours exactement à FPS et nous savons tous que ce n'est pas le cas car cela dépend du matériel de l'utilisateur.

Je veux que la minuterie soit assez précise (ayant seulement comme erreur 0,0001s). Suggérer un algorithme javascript pour calculer la différence entre now() et start_time() est également le bienvenu.

Répondre

2

Vous pouvez enregistrer l'heure de début dans une variable.

Ensuite, créez une nouvelle minuterie chaque fois que vous voulez et soustraie la variable du temps de démarrage de celui-ci .. Le résultat sera la différence en millisecondes ..

Vous pouvez également utiliser le temps réel divisé par les cadres à l'encontre de obtenir une moyenne précise framerate de votre application ..

quelque chose comme

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

et chaque fois que vous voulez vérifier

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

Démo à http://jsfiddle.net/gaby/CF4Ju/

3

Si vous voulez précision, jetez un coup d'oeil dans high resolution timers. Cependant, cette fonctionnalité n'est pas disponible sur tous les navigateurs.

De plus, Processing.js possède une variable interne en lecture seule nommée frameCount. Vous pouvez interroger cela au lieu de compter les cadres vous-même.

0

J'ai composé cette classe pour un jeu. Il utilise millis() et est indépendant de 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; 
    } 
} 

Si un objet Timer est instancié avec un paramètre, on suppose que la minuterie devrait diminuer. Sinon, la condition de sortie peut être vérifiée en obtenant la valeur de la méthode getSeconds().