Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
2
respuestas

Propuesta de adaptación de ejercicio Diseñando con el mouse para una cantidad cualquiera de colores

<canvas width="600" height="400"></canvas>

<script>
    var pantalla = document.querySelector('canvas');
    var pincel = pantalla.getContext('2d');

    pincel.fillStyle = 'grey';
    pincel.fillRect(0, 0, 600, 400);

    var puedoDibujar = false;

    //Coloco todas las variables al principio para facilitar la lectura de los comentarios 

    /*Arreglo de colores que queremos usar. Para habilitar un nuevo color solamente hay que agregarlo al array.*/
    var colores = ["red", "green", "blue", "black", "orange", "yellow", "pink", "brown", "white", "darkgrey"];

    /*Array para guardar las coordenadas X que indican el límite derecho de cada cuadrado en nuestra barra. La función dibujarBarra
    se encarga de agregar los límites al array*/
    var xColores = [];

    /*En esta variable elegimos la altura de cada cuadrado. Como un cuadrado tiene lados iguales, usamos la misma variable para definir
    el ancho. En caso de querer dibujar rectángulos, habría que escribir una variable anchoX */
    var alturaY = 30;

    /*Esta variable define el tamaño que tendrá el círculo dibujado por el pincel. Al definirla por separado, podemos elegir radios arbitrarios y usar el dato en otros cálculos. */
    var radioCirculo = 5;

    /*Esta variable selecciona un color por defecto al iniciar la página. */
    var colorSeleccionado = "black"; 

    /*Ver comentario en opiniones (excedía el límite de caracteres permitidos)*/
    function dibujarCirculo(evento) {
        var x = evento.pageX - pantalla.offsetLeft;
        var y = evento.pageY - pantalla.offsetTop;

        if (x <= xColores[xColores.length - 1] + radioCirculo && y <= alturaY + radioCirculo){

        }else if (puedoDibujar) {

            pincel.fillStyle = colorSeleccionado;
            pincel.beginPath();
            pincel.arc(x, y, radioCirculo, 0, 2 * 3.14);
            pincel.fill();
        }

    }

    /*Ver comentario en opiniones (excedía el límite de caracteres permitidos)*/
    function cambiarColor(evento){
        var x = evento.pageX - pantalla.offsetLeft;
        var y = evento.pageY - pantalla.offsetTop;


        if (x < xColores[xColores.length - 1] && y < alturaY){

            var coordenadaInicio = 0;

            for(var i = 0; i <= xColores.length; i++){

                if(x > coordenadaInicio && x < xColores[i]){
                    colorSeleccionado = colores[i];
                    break;
                }else{
                    coordenadaInicio = xColores[i]; 

                }

            }

        }

    }



    function dibujarRectangulo(x, y, base, altura, color) {
        var pantalla = document.querySelector("canvas");
        var pincel = pantalla.getContext("2d");

        pincel.fillStyle=color;
        pincel.fillRect(x,y, base, altura);
        pincel.strokeStyle="black";
        pincel.strokeRect(x,y, base, altura);
    }


    /* La función dibujarBarra hace uso de la función dibujarRectangulo para dibujar cuadrados de lado alturaY. El ciclo for itera a traves del array colores para agregar cada nuevo color a la derecha (según los píxeles que elegimos para alturaY, ya que dibujamos cuadrados)*/
    function dibujarBarra(){
        var x = 0;
        for(var i = 0; i < colores.length; i++){
            dibujarRectangulo(x,0,alturaY,alturaY,colores[i]);
            xColores.push(x+=alturaY);
        }

    }


    dibujarBarra();

    pantalla.onmousemove = dibujarCirculo;

    /* El evento onclick se encarga de llamar a la función cambiarColor, que evaluará primero si estamos en el área correspondiente a la barra de colores*/
    pantalla.onclick = cambiarColor;

    function habilitarDibujar() {

        puedoDibujar = true;
    }

    function deshabilitarDibujar() {

        puedoDibujar = false;
    }

    pantalla.onmousedown = habilitarDibujar;

    pantalla.onmouseup = deshabilitarDibujar;

</script>
2 respuestas
/*
Comentario de función dibujarCírculo:

La función dibujarCírculo fue modificada para no dibujar sobre la barra de colores. Primero se determinan las coordenadas x e y, para luego evaluar si se encuentran dentro del área de la barra. En caso de que se encuentren en el área de la barra, entonces el programa no hace nada. En caso contrario, procede a evaluar si puedoDibujar es true.
    Para determinar el área de la barra utilizamos la variable xColores, que guarda todas las coordenadas x que son el límite derecho de cada cuadrado de color (guardadas mediante push al crear la barra). Sólo nos interesa conocer cuál fue la última guardada (que es el límite final de la barra). Como no sabemos cuántos colores tenemos (porque podemos agregar muchos), entonces buscamos el último elemento que agregamos al array. Para esto, nos fijamos cuántos elementos tiene el array (xColores.length) y le restamos 1 para obtener el índice correspondiente al último elemento (ya que los índices están corridos por 1 al empezar a contar desde 0). Cuando obtenemos el índice, buscamos el valor de la coordenada x en el array (xColores[xColores.lenght - 1]) y nos fijamos si la coordenada x de nuestro click es menor que esa coordenada (y mayor a la coordenada 0, que es el límite izquierdo de la barra). También nos aseguramos de que nuestra coordenada Y sea menor que la altura de la barra (alturaY). 
    También hacemos una corrección para evitar que, al hacer click en los bordes de la barra, el radio del círculo resultante se dibuje encima del borde. Necesitamos extender los límites de las coordenadas x e y para que sólo nos dibuje un círculo cuyo radio no llegue a tocar el borde la barra. Para eso, agregamos el valor guardado en la variable radioCirculo tanto a nuestra evaluación de x como de y.

 Comentario de la función cambiarColor: 

En caso de que se haga click sobre el área del canvas, pantalla.onclick nos dirige a esta función, que tomará las coordendas x e y para luego evaluar si caen dentro de las coordenadas de la barra (ver el comentario de la función dibujarCirculo para la explicación del uso de xColores[xColores.length -1] y alturaY). 
    En esta función, utilizamos también el array xColores, que guarda los límites derechos de cada cuadrado de colores de la barra (guardados mediante push al crear la barra).
    Para evaluar si nuestro click cae en el área de un cuadrado particular, tenemos que recorrer el área de cada cuadrado y determinar si la coordenada x de nuestro click es mayor que la coordenada x del límite izquierdo del cuadrado y, al mismo tiempo, menor que la coordenada x del límite derecho (la altura (alturaY) es constante, sólo necesitamos evaluarla al principio, pero después no varía de cuadrado en cuadrado). 
    En cada iteración de nuestro ciclo, evaluaremos cuál es el límite izquierdo del cuadrado, cuál es su límite derecho y si nuestro click cae dentro del área. Todos los límites derechos están guardados en el array xColores. Pero los límites izquierdos no están guardados en ningún lado, por lo que tenemos que generarlos. Sabemos que el límite del primer cuadrado es 0 porque coincide con el límite izquierdo de la barra. Así que definimos una variable coordenadaInicio y la inicializamos en 0.
    En la primera iteración del ciclo for, se evaluará si la coordenada x de nuestro click se encuentra entre 0 (la coordenadaInicio) y xColores[0] (el primer límite del array). Si la evaluación resulta verdadera, entonces asignamos el primer color del array de colores (colores[0]) a la variable colorSeleccionado (que habíamos inicializado con "black" al abrir la página). Si la evaluación resulta falsa, entonces nos movemos al siguiente cuadrado. Tenemos que tener cuidado de cambiar ahora el límite izquierdo para que coincida con el límite del segundo cuadrado. Eso es fácil, el límite derecho del primer cuadrado y el límite izquierdo del segundo cuadrado usan la misma coordenada x. Así que ahora elegimos como nuestra coordenadaInicio del segundo cuadrado el mismo límite derecho del primer cuadrado que estábamos evaluando (coordenadaInicio = xColores[0]). En la nueva iteración, coordenadaInicio será igual a xColores[0] y el límite derecho será el elemento que sigue en el array xColores (xColores[1]). 
    El ciclo va a recorrer todo el array de coordenadas de xColores hasta dar con el cuadrado clickeado. 
    */

Hola Juan, espero estés muy bien.

Felicitaciones por tu aprendizaje. Estamos priorizando el foro para postear dudas, así optimizamos el tiempo de respuesta para ustedes.

Para no dejar de compartir los códigos, actividades y ejercicios que realizas, creamos un canal en Discord (#compartatucodigo) donde puedes compartirlos, dar y sugerir mejoras con el resto de tus compañeros.

Si este post te ayudó, por favor, marca como solucionado ✓. Continúa con tus estudios