{"id":406,"date":"2022-10-06T09:43:19","date_gmt":"2022-10-06T07:43:19","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=406"},"modified":"2022-10-06T09:43:19","modified_gmt":"2022-10-06T07:43:19","slug":"5-6-temporizadores","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/5-6-temporizadores\/","title":{"rendered":"5.6. Temporizadores"},"content":{"rendered":"<p>Aunando los distintos conocimientos que hasta ahora hemos adquirido podemos desarrollar programas que cambien a lo largo del tiempo. Mediante el uso de variables y condicionales seremos capaces de crear <em>sketches <\/em>que detecten que ha pasado una cantidad determinada de tiempo y ejecutar ciertas acciones cuando esto ocurra. Podr\u00edamos por ejemplo quitar el <span class=\"courier\">noLoop()<\/span> que utilizamos en el \u00faltimo ejemplo y hacer que obtengamos un valor aleatorio para el relleno del c\u00edrculo cada 2 segundos manteniendo el <em>sketch<\/em> corriendo a 60 <em>frames<\/em> por segundo.<\/p>\n<p>Para ello, podemos hacer uso del m\u00e9todo <span class=\"courier\">millis()<\/span> o tambi\u00e9n podemos usar la variable propia del sistema <span class=\"courier\">frameCount<\/span>. Ambas maneras permiten llevar la cuenta del tiempo transcurrido en nuestro <em>sketch<\/em> pero lo hacen de distinta manera. La variable del sistema (como <span class=\"courier\">width<\/span> o <span class=\"courier\">height<\/span>) <span class=\"courier\">frameCount<\/span> almacena el n\u00famero de <em>frame<\/em> actual en el que nos encontramos. Recordemos que por defecto en P5 la velocidad de refresco es de 60 fotogramas por segundo (algo que podemos cambiar si usamos el m\u00e9todo <span class=\"courier\">frameRate()<\/span>), por lo que <span class=\"courier\">frameCount<\/span> aumentar\u00e1 60 unidades cada segundo que transcurra.<\/p>\n<p>El n\u00famero de <em>frames<\/em> por segundo (FPS) que podemos alcanzar depende de la capacidad de nuestro ordenador para procesar todas las instrucciones que tenemos en nuestro <em>sketch.<\/em> Si le pedimos que haga demasiadas cosas, no le da tiempo a hacerlo todo en 1\/60 de segundo y el <em>frame rate<\/em> baja. 60 <em>frames<\/em> por segundo es un est\u00e1ndar en el mundo audiovisual (los televisores de 60 Hz por ejemplo, que muestran 60 im\u00e1genes por segundo), pero dependiendo del caso podr\u00eda ser aceptable trabajar a 30 FPS o incluso a 15 FPS (muchas pel\u00edculas de animaci\u00f3n usan 12 FPS). En nuestro caso, intentaremos mantener los 60 FPS siempre que podamos.<\/p>\n<p>El m\u00e9todo <span class=\"courier\">millis()<\/span> es similar a utilizar <span class=\"courier\">frameCount<\/span>, pero lo que nos devuelve <span class=\"courier\">millis()<\/span> son los milisegundos (mil\u00e9simas de segundo) que han transcurrido desde que iniciamos el <em>sketch<\/em>.<\/p>\n<p><figure id=\"attachment_148\" aria-describedby=\"caption-attachment-148\" style=\"width: 500px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"wp-image-148\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_057.jpg\" alt=\"\" width=\"500\" height=\"383\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_057.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_057-300x230.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_057-768x588.jpg 768w\" sizes=\"(max-width: 500px) 100vw, 500px\" \/><figcaption id=\"caption-attachment-148\" class=\"wp-caption-text\">Figura 58. <span class=\"courier\">frameCount<\/span> y <span class=\"courier\">millis()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>En el ejemplo de la figura anterior vemos en funcionamiento tanto la variable del sistema <span class=\"courier\">frameCount<\/span> como el m\u00e9todo <span class=\"courier\">millis()<\/span>. Se puede observar un peque\u00f1o desfase (60 <em>frames<\/em> no son exactamente 1.000 milisegundos), que tiene que ver con lo comentado anteriormente sobre la capacidad de nuestro ordenador. Siempre tratar\u00e1 de alcanzar los 60 <em>frames<\/em> por segundo, pero si le exigimos mucho tratando de realizar muchas cosas simult\u00e1neamente, el <em>frame rate <\/em>caer\u00e1.<\/p>\n<p>Veamos un par de ejemplos sencillos en los que cambiaremos el color de fondo aleatoriamente cada segundo utilizando temporizadores tanto con <span class=\"courier\">frameCount<\/span> como con <span class=\"courier\">millis()<\/span>:<\/p>\n<p><figure id=\"attachment_150\" aria-describedby=\"caption-attachment-150\" style=\"width: 700px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"wp-image-150\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_058.jpg\" alt=\"\" width=\"700\" height=\"403\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_058.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_058-300x173.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_058-768x442.jpg 768w\" sizes=\"(max-width: 700px) 100vw, 700px\" \/><figcaption id=\"caption-attachment-150\" class=\"wp-caption-text\">Figura 59. Contador con <span class=\"courier\">frameCount<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>Este quiz\u00e1 sea el ejemplo m\u00e1s sencillo para hacer un contador. Primero determinamos cada cu\u00e1ntos <em>frames<\/em> queremos que se produzca un cambio. En nuestro caso, como queremos que el cambio se produzca cada segundo y sabemos que el <em>sketch<\/em> corre a 60 FPS, ser\u00e1n 60 <em>frames<\/em>. A continuaci\u00f3n, en el <span class=\"courier\">draw()<\/span> creamos una condici\u00f3n en la que utilizamos <span class=\"courier\">frameCount % framesToEvent == 0<\/span>. El operador %, si recordamos de pasados temas, es el operador m\u00f3dulo, que nos da el resto de la divisi\u00f3n de <span class=\"courier\">frameCount<\/span> entre <span class=\"courier\">framesToEvent<\/span>. El resto de esta divisi\u00f3n ser\u00e1 0 siempre que el <span class=\"courier\">frameCount<\/span>, el n\u00famero de <em>frame<\/em>\u00a0actual, sea m\u00faltiplo de <span class=\"courier\">framesToEvent<\/span>. En nuestro caso, el resto de 60 entre 60 ser\u00e1 0, el de 120 entre 60 tambi\u00e9n 0, el de 180, 240, etc. De esta manera, la condici\u00f3n se cumple \u00fanicamente cada vez que transcurren 60 <em>frames<\/em>, un segundo, tal como se puede observar en la consola.<\/p>\n<p>Pasemos a ver c\u00f3mo podemos hacer lo mismo pero utilizando <span class=\"courier\">millis()<\/span> en lugar de <span class=\"courier\">frameCount<\/span>:<\/p>\n<p><figure id=\"attachment_152\" aria-describedby=\"caption-attachment-152\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-152\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_059.jpg\" alt=\"\" width=\"800\" height=\"556\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_059.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_059-300x209.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_059-768x534.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-152\" class=\"wp-caption-text\">Figura 60. Contador con <span class=\"courier\">millis()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>En este caso lo que hacemos es crear una variable que lleva la cuenta de los milisegundos transcurridos rest\u00e1ndole los milisegundos transcurridos cuando ocurri\u00f3 el \u00faltimo evento. En la condici\u00f3n del <span class=\"courier\">if<\/span> testamos si este tiempo es mayor que 1.000 milisegundos y, si fuese as\u00ed, se cambia el color de fondo y se registra el tiempo en el que se ha producido el cambio para rest\u00e1rselo al tiempo actual y realizar de nuevo la comparaci\u00f3n. En la consola se puede observar c\u00f3mo una vez llegados a los 1.000 milisegundos transcurridos, se produce el cambio y el valor se reestablece.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Aunando los distintos conocimientos que hasta ahora hemos adquirido podemos desarrollar programas que cambien a lo largo del tiempo. Mediante el uso de variables y condicionales seremos capaces de crear sketches que detecten que ha pasado una cantidad determinada de tiempo y ejecutar ciertas acciones cuando esto ocurra. Podr\u00edamos por ejemplo quitar el que utilizamos [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"acf":[],"_links":{"self":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/406"}],"collection":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/comments?post=406"}],"version-history":[{"count":1,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/406\/revisions"}],"predecessor-version":[{"id":407,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/406\/revisions\/407"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}