5. Condicionals

5.6. Temporitzadors

Unint els diferents coneixements que fins ara hem adquirit podem desenvolupar programes que canviïn al llarg del temps. Mitjançant l’ús de variables i condicionals serem capaços de crear sketches que detectin que ha passat una quantitat determinada de temps i executar certes accions quan això passi. Podríem, per exemple, treure el noLoop() qque utilitzem en l’últim exemple i fer que obtinguem un valor aleatori per al farciment del cercle cada 2 segons mantenint l’sketch corrent a 60 frames per segon.

Per a això, podem fer ús del mètode millis() o també podem usar la variable pròpia del sistema frameCount. Totes dues maneres permeten portar el compte del temps transcorregut al nostre sketch però ho fan de manera diferent. La variable del sistema (com width o height) frameCount emmagatzema el nombre de frames actual en el qual ens trobem. Recordem que per defecte en P5 la velocitat d’actualització és de 60 fotogrames per segon (ho podem canviar si usem el mètode frameRate()), per la qual cosa frameCount augmentarà 60 unitats cada segon que transcorri.

El nombre de frames per segon (FPS) que podem aconseguir depèn de la capacitat del nostre ordinador per processar totes les instruccions que tenim al nostre sketch. Si li demanem que faci massa coses, no tindrà temps de fer-ho tot en 1/60 de segon i el frame rate baixa. Seixanta frames per segon és un estàndard en el món audiovisual (els televisors de 60 Hz, per exemple, que mostren 60 imatges per segon), però depenent del cas podria ser acceptable treballar a 30 FPS o fins i tot a 15 FPS (moltes pel·lícules d’animació usen 12 FPS). En el nostre cas, intentarem mantenir els 60 FPS sempre que puguem.

El mètode millis() és similar a utilitzar frameCount, però el que ens retorna millis() són els mil·lisegons (mil·lèsimes de segon) que han transcorregut des que vàrem iniciar l’sketch.

Figura 58. frameCount i millis()
Font: elaboració pròpia.
A l’exemple de la figura anterior veiem en funcionament tant la variable del sistema frameCount com el mètode millis(). Es pot observar un petit desfasament (60 frames no són exactament 1.000 mil·lisegons), que té a veure amb el que hem comentat anteriorment sobre la capacitat del nostre ordinador. Sempre mirarà d’aconseguir els 60 frames per segon, però si li exigim molt mirant de fer moltes coses simultàniament, el frame rate fallarà.

Vegem un parell d’exemples senzills en els quals canviarem el color de fons aleatòriament cada segon utilitzant temporitzadors tant amb frameCount com amb millis():

Figura 59. Comptador amb frameCount
Font: elaboració pròpia.
Aquest potser és l’exemple més senzill per fer un comptador. Primer determinem cada quants frames volem que es produeixi un canvi. En el nostre cas, com que volem que el canvi es produeixi cada segon i sabem que l’sketch corre a 60 FPS, seran 60 frames. A continuació, al draw() creem una condició en la qual utilitzem frameCount % framesToEvent == 0. L’operador %, si ho recordem de temes anteriors, és l’operador mòdul, que ens dona la resta de la divisió de frameCount entre framesToEvent. La resta d’aquesta divisió serà 0 sempre que el frameCount, el nombre de frames actual, sigui múltiple de framesToEvent. En el nostre cas, la resta de 60 entre 60 serà 0, el de 120 entre 60 també 0, el de 180, 240, etc. D’aquesta manera, la condició es compleix únicament cada vegada que transcorren 60 frames, un segon, tal com es pot observar a la consola.

Ara veurem com podem fer el mateix però utilitzant millis() en lloc de frameCount:

Figura 60. Comptador amb millis()
Font: elaboració pròpia.
En aquest cas el que fem és crear una variable que porta el compte dels mil·lisegons transcorreguts i li resta els mil·lisegons transcorreguts quan passa l’últim esdeveniment. En la condició del if testem si aquest temps és més gran que 1.000 mil·lisegons i, si fos així, es canvia el color de fons i es registra el temps en el qual s’ha produït el canvi per restar-li al temps actual i fer de nou la comparació. A la consola es pot observar com una vegada arribats als 1.000 mil·lisegons transcorreguts, es produeix el canvi i el valor es restableix.