Astuces processing

Dernière mise à jour le 17 janvier 2021 par LMD

1_ Créer un timer

Un timer permet d’exécuter une action, ou un ensemble d’actions à intervalles réguliers. Généralement, un timer est basé sur le temps. Il est donc envisageable d’utiliser la cadence du draw() pour cela, mais la façon la plus précise reste l’utilisation de millis().

La commande millis() relève le temps écoulé depuis le début de l’animation, lorsqu’on lance un sketch, et utilise la milliseconde comme unité. De fait, lorsque millis() = 1000, il s’est écoulé une seconde.

Pour créer un timer, cela se passe en plusieurs temps.
il faut préalablement déterminer un intervalle de temps dans une variable initiale. Disons par exemple int duree = 1000; pour une durée d’une seconde.
A un moment donné (ce peut être au début dans le setup() ou sur le déclenchement d’une action), il faut relever la valeur courante de millis() dans une variable, disons int topDepart; par topDepart = millis();
Puis, il faut tester dans une condition pour vérifier si la durée initiale s’est écoulée depuis le top départ, généralement dans le draw(). Si cette condition est vraie, une action aura lieu, sinon, il faudra attendre… On teste notamment si la valeur courante de millis() moins la valeur relevée dans topDepart, soit le temps écoulé depuis, est supérieure à la durée prédéfinie :
if (millis() - topDepart > duree) { // action }
Il faut dà la fin de la condition, faire un nouveau top depart, donc affecter la nouvelle valeur de millis() à topDepart : topDepart = millis();

Voici un exemple pour illustrer ce fonctionnement. Un cercle est dessiné à un emplacement quelconque. Toutes les secondes, il est redessiné à un emplacement différent, toujours aléatoire.

// On détermine un intervalle préalable d'une seconde
int duree = 1000;
int topDepart;

// Position et diametre du cercle
float posX, posY, diametre;

void setup() {
  size(600, 600);
  // Initialisation des valeurs pour le dessin du premier cercle
  diametre = 60;
  posX = random(width) - diametre/2;
  posY = random(height) - diametre/2;
  // Déclenchement du timer
  topDepart = millis();
}

void draw() {
  background(255);
  
  // Test pour savoir si la durée est écoulée
  if(millis() - topDepart > duree) {
    // Calcul d'une nouvelle position pour le prochain cercle
    posX = random(width) - diametre/2;
    posY = random(height) - diametre/2;
    // Reset du timer
    topDepart = millis();
  }
  
  // Dessin du cercle
  noStroke();
  fill(0);
  circle(posX, posY, diametre);
}

Design collaboratif