{"id":414,"date":"2022-10-06T10:11:46","date_gmt":"2022-10-06T08:11:46","guid":{"rendered":"http:\/\/quadern-programacio.recursos.uoc.edu\/?page_id=414"},"modified":"2022-11-13T13:14:19","modified_gmt":"2022-11-13T11:14:19","slug":"6-3-interactuando-con-el-raton","status":"publish","type":"page","link":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/6-3-interactuando-con-el-raton\/","title":{"rendered":"6.3. Interactuando con el rat\u00f3n"},"content":{"rendered":"<p>Para poder utilizar el rat\u00f3n de manera interactiva en nuestros programas, P5 nos ofrece algunas <strong>variables del sistema <\/strong>que almacenan par\u00e1metros relativos al movimiento y posici\u00f3n del rat\u00f3n y varias <strong>funciones <\/strong>que se ejecutan al detectar ciertos eventos relacionados con este.<\/p>\n<h3>Posici\u00f3n del rat\u00f3n<\/h3>\n<p>Podemos obtener la posici\u00f3n del rat\u00f3n en nuestro <em>canvas<\/em> por medio de las variables <span class=\"courier\">mouseX<\/span> y <span class=\"courier\">mouseY<\/span>:<\/p>\n<p><figure id=\"attachment_164\" aria-describedby=\"caption-attachment-164\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-164\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_065.jpg\" alt=\"\" width=\"800\" height=\"368\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_065.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_065-300x138.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_065-768x353.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-164\" class=\"wp-caption-text\">Figura 66. <span class=\"courier\">mouseX<\/span> y <span class=\"courier\">mouseY<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>En la figura 66 observamos c\u00f3mo el c\u00edrculo que dibujamos sigue la posici\u00f3n de nuestro rat\u00f3n sobre el <em>canvas<\/em>, ya que como par\u00e1metros de sus coordenadas <em>x<\/em> e <em>y<\/em> estamos utilizando las variables <span class=\"courier\">mouseX<\/span> y <span class=\"courier\">mouseY<\/span>. Al haber dibujado el <span class=\"courier\">background()<\/span> en el <span class=\"courier\">setup()<\/span>, este se dibujar\u00e1 una \u00fanica vez y podemos ver c\u00f3mo en cada <em>frame<\/em> se dibuja un c\u00edrculo fielmente en la posici\u00f3n del rat\u00f3n. Veamos qu\u00e9 ocurre si modificamos el <em>frame rate<\/em> de nuestro <em>sketch<\/em> utilizando el m\u00e9todo <span class=\"courier\">frameRate()<\/span> y d\u00e1ndole una velocidad de dos fotogramas por segundo:<\/p>\n<p><figure id=\"attachment_166\" aria-describedby=\"caption-attachment-166\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-166\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_066.jpg\" alt=\"\" width=\"800\" height=\"371\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_066.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_066-300x139.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_066-768x356.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-166\" class=\"wp-caption-text\">Figura 67. <span class=\"courier\">mouseX<\/span> y <span class=\"courier\">mouseY<\/span> con un menor <em>frame rate<\/em><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>Ahora podemos observar que el seguimiento del rat\u00f3n es mucho menos fiel. Esto se debe a que, como hemos establecido una ejecuci\u00f3n a una velocidad de dos <em>frames<\/em> por segundo, la posici\u00f3n del rat\u00f3n se registra \u00fanicamente una vez cada medio segundo (dos veces cada segundo).<\/p>\n<p>Podemos tambi\u00e9n mover el c\u00f3digo que dibuja el fondo desde el <span class=\"courier\">setup()<\/span> al <span class=\"courier\">draw()<\/span>:<\/p>\n<pre>function draw() {\r\n  background(100);\r\n  ellipse(mouseX, mouseY, 50, 50);\r\n}<\/pre>\n<p>De esta manera, los c\u00edrculos dejar\u00e1n de acumularse en el <em>canvas<\/em>, ya que en cada <em>frame<\/em> estamos pintando de nuevo el fondo, que tapa el c\u00edrculo que se dibuj\u00f3 en el anterior <em>frame<\/em>. Podemos hacer un uso creativo de esta circunstancia si al color de fondo le damos un poco de transparencia:<\/p>\n<pre>function draw() {\r\n  background(100, 40); \/\/ Gris con transparencia\r\n  ellipse(mouseX, mouseY, 50, 50);\r\n}<\/pre>\n<figure id=\"attachment_168\" aria-describedby=\"caption-attachment-168\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-168\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_067.jpg\" alt=\"\" width=\"800\" height=\"367\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_067.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_067-300x138.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_067-768x352.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-168\" class=\"wp-caption-text\">Figura 68. Dejando el rastro del rat\u00f3n<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En la figura se puede observar que el rastro de los c\u00edrculos se va desvaneciendo debido a que el <span class=\"courier\">background()<\/span>, que no es opaco al 100 %, se superpone en cada <em>frame <\/em>y su opacidad se acumula hasta ocultar del todo los c\u00edrculos que se dibujaron en los <em>frames<\/em> anteriores. Si cambiamos el valor de transparencia del fondo, podremos obtener rastros m\u00e1s o menos largos.<\/p>\n<p>P5 tambi\u00e9n nos ofrece otro par de variables <span class=\"courier\">pmouseX<\/span>, <span class=\"courier\">pmouseY<\/span> que almacenan la posici\u00f3n que ten\u00eda el rat\u00f3n en el <em>frame<\/em> anterior, lo que nos puede resultar \u00fatil si queremos, por ejemplo, dibujar una l\u00ednea continua que siga el movimiento del rat\u00f3n:<\/p>\n<p><figure id=\"attachment_170\" aria-describedby=\"caption-attachment-170\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-170\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_068.jpg\" alt=\"\" width=\"800\" height=\"338\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_068.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_068-300x127.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_068-768x324.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-170\" class=\"wp-caption-text\">Figura 69. L\u00edneas continuas con <span class=\"courier\">pmouseX<\/span> y <span class=\"courier\">pmouseY<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>Adem\u00e1s de para crear \u00abpinceles\u00bb, podemos darle a estas variables el uso que necesitemos en nuestros <em>sketches<\/em>. Veamos un ejemplo sencillo en el que cambiamos el color del fondo dependiendo de la posici\u00f3n del rat\u00f3n en el <em>canvas<\/em>:<\/p>\n<pre>function setup() {\r\n\tcreateCanvas(400, 400);\r\n}\r\n\r\nfunction draw() {\r\n\tif(mouseX &lt; width * 0.5){\r\n\t\tbackground(\"lightblue\");\r\n\t} else {\r\n\t\tbackground(\"lightpink\");\r\n\t}\r\n}<\/pre>\n<p>Si ejecutamos este c\u00f3digo y movemos el rat\u00f3n por el <em>canvas<\/em>, observaremos que cuando el rat\u00f3n se encuentra en la mitad izquierda del <em>canvas<\/em>, el color de fondo es azul, mientras que si lo movemos a la mitad derecha, el color de fondo cambia a rosa.<\/p>\n<h3>Clics del rat\u00f3n<\/h3>\n<p>Adem\u00e1s de poder usar la posici\u00f3n, tambi\u00e9n podemos detectar cu\u00e1ndo hemos hecho clic con alguno de los botones del rat\u00f3n. Para ello, P5 nos ofrece la variable booleana <span class=\"courier\">mouseIsPressed<\/span>, que tendr\u00e1 un valor <span class=\"courier\">true<\/span> cuando pulsemos cualquiera de los botones del rat\u00f3n y <span class=\"courier\">false<\/span> en caso contrario. Podemos utilizar una estructura condicional para evaluar esta variable y cambiar alg\u00fan par\u00e1metro de nuestro dibujo en consecuencia. En el siguiente caso cambiamos el tama\u00f1o de un c\u00edrculo cuando alg\u00fan bot\u00f3n del rat\u00f3n sea pulsado:<\/p>\n<pre>let size = 50;\r\nif (mouseIsPressed == true) {\r\n  size = 100;\r\n}\r\ncircle(width * 0.5, height * 0.5, size);<\/pre>\n<p>Cuando en una estructura condicional evaluamos una variable booleana, podemos prescindir del operador de comparaci\u00f3n:<\/p>\n<pre>if (mouseIsPressed) {\r\n}\r\n\/\/ Equivale a:\r\nif (mouseIsPressed == true){\r\n}<\/pre>\n<p>Podemos combinar las variables de posici\u00f3n del rat\u00f3n con esta nueva variable booleana para detectar si hacemos clic en alguna zona de nuestro <em>canvas<\/em>. Veamos un ejemplo en el que cambiamos el color de fondo solo si detectamos que se ha hecho clic con el rat\u00f3n dentro de un cuadrado:<\/p>\n<figure id=\"attachment_172\" aria-describedby=\"caption-attachment-172\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-172\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_069.jpg\" alt=\"\" width=\"800\" height=\"318\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_069.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_069-300x119.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_069-768x305.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-172\" class=\"wp-caption-text\">Figura 70. Detectando el clic del rat\u00f3n dentro de una figura<br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<p>En este ejemplo, hemos encadenado varias condiciones con operadores l\u00f3gicos para \u00abdelimitar\u00bb el \u00e1rea donde queremos que se detecte el clic del rat\u00f3n. Para otros casos similares podemos utilizar tambi\u00e9n el m\u00e9todo <a href=\"https:\/\/p5js.org\/reference\/#\/p5\/dist\" target=\"_blank\" rel=\"noopener\"><span class=\"courier\">dist()<\/span><\/a>, al que le pasamos como par\u00e1metros las coordenadas de dos puntos y nos retorna la distancia entre dichos puntos:<\/p>\n<pre>\/\/ Punto (100, 200);\r\nlet x1 = 100;\r\nlet y1 = 200;\r\n\/\/ Punto (200, 200);\r\nlet x2 = 200;\r\nlet y2 = 200;\r\n\r\nlet distance = dist(x1, y1, x2, y2); \/\/ Devolver\u00e1 100<\/pre>\n<p>El m\u00e9todo <span class=\"courier\">dist()<\/span> puede resultar \u00fatil por ejemplo para detectar si el rat\u00f3n est\u00e1 dentro o no de un c\u00edrculo, algo que ser\u00eda m\u00e1s complejo de delimitar encadenando condiciones:<\/p>\n<figure id=\"attachment_174\" aria-describedby=\"caption-attachment-174\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-174\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_070.jpg\" alt=\"\" width=\"800\" height=\"462\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_070.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_070-300x173.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_070-768x444.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-174\" class=\"wp-caption-text\">Figura 71. Detectando la posici\u00f3n del rat\u00f3n con <span class=\"courier\">dist()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>\n<h3>Diferenciando entre botones<\/h3>\n<p>Tambi\u00e9n podemos detectar con qu\u00e9 bot\u00f3n del rat\u00f3n hemos hecho clic, para lo que podemos usar <span class=\"courier\">mouseButton<\/span>:<\/p>\n<pre>if(mouseIsPressed) {\r\n  if(mouseButton == LEFT) {\r\n    \/\/ Bot\u00f3n izquierdo\r\n  }\r\n  if(mouseButton == RIGHT) {\r\n    \/\/ Bot\u00f3n derecho\r\n  }\r\n  if(mouseButton == CENTER) {\r\n    \/\/ Bot\u00f3n central\r\n  }\r\n}<\/pre>\n<h3>Eventos de rat\u00f3n<\/h3>\n<p>Adem\u00e1s de las variables <span class=\"courier\">mouseX<\/span>, <span class=\"courier\">mouseY<\/span>, <span class=\"courier\">pmouseX<\/span>, <span class=\"courier\">pmouseY<\/span> y la variable booleana <span class=\"courier\">mouseIsPressed<\/span>, P5 tambi\u00e9n nos ofrece varias funciones que se ejecutan con distintos eventos del rat\u00f3n. Pod\u00e9is consultar todas estas funciones en la <a href=\"https:\/\/p5js.org\/reference\/\" target=\"_blank\" rel=\"noopener\">referencia de P5<\/a>, dentro del apartado \u00abEvents\u00bb. Veamos por ejemplo un posible uso de la funci\u00f3n <span class=\"courier\">mousePressed()<\/span>:<\/p>\n<p><figure id=\"attachment_176\" aria-describedby=\"caption-attachment-176\" style=\"width: 800px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" class=\"size-full wp-image-176\" src=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_071.jpg\" alt=\"\" width=\"800\" height=\"367\" srcset=\"\/wp-content\/uploads\/2022\/10\/PID_00290094_071.jpg 800w, \/wp-content\/uploads\/2022\/10\/PID_00290094_071-300x138.jpg 300w, \/wp-content\/uploads\/2022\/10\/PID_00290094_071-768x352.jpg 768w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption id=\"caption-attachment-176\" class=\"wp-caption-text\">Figura 72. La funci\u00f3n <span class=\"courier\">mousePressed()<\/span><br \/>Fuente: elaboraci\u00f3n propia.<\/figcaption><\/figure>El c\u00f3digo que escribamos dentro de la funci\u00f3n <span class=\"courier\">mousePressed()<\/span> se ejecutar\u00e1 \u00fanicamente cuando presionemos alguno de los botones del rat\u00f3n. En este caso, hemos creado al principio del <em>sketch<\/em> una variable booleana <span class=\"courier\">showCircle<\/span> que hemos inicializado con el valor <span class=\"courier\">false<\/span>. Cuando hagamos clic con el rat\u00f3n se ejecutar\u00e1 la instrucci\u00f3n <span class=\"courier\">showCircle = !showCircle<\/span>, que asigna a la variable <span class=\"courier\">showCircle<\/span> el valor contrario al que actualmente tiene: si es <span class=\"courier\">false<\/span>, pasar\u00e1 a ser <span class=\"courier\">true<\/span> y viceversa. De esta manera, podemos alternar f\u00e1cilmente entre un estado y otro y mostrar o no el c\u00edrculo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Para poder utilizar el rat\u00f3n de manera interactiva en nuestros programas, P5 nos ofrece algunas variables del sistema que almacenan par\u00e1metros relativos al movimiento y posici\u00f3n del rat\u00f3n y varias funciones que se ejecutan al detectar ciertos eventos relacionados con este. Posici\u00f3n del rat\u00f3n Podemos obtener la posici\u00f3n del rat\u00f3n en nuestro canvas por medio [&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\/414"}],"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=414"}],"version-history":[{"count":2,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/414\/revisions"}],"predecessor-version":[{"id":763,"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/pages\/414\/revisions\/763"}],"wp:attachment":[{"href":"http:\/\/quadern-programacio.recursos.uoc.edu\/es\/wp-json\/wp\/v2\/media?parent=414"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}