Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Solucionado (ver solución)
Solucionado
(ver solución)
3
respuestas

Se puede optimizar la funcion cambiarColor ?

Hola compañeros , al enfrentarme al ejercicio final de lógica de programación parte 3 "Diseñando con el mouse" logre sacar este código , que a mi parece esta algo más optimizado que el que muestra el instructor , sin embargo quiero saber si es posible optimiza la función cambiarColor ya que se repite bastante y no se actualiza en caso de que queramos agregar otro color. Agradecería mucho si alguien me puede dar una idea al respecto.

<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;
    let dimensionPaleta = 50;

    const paleta = ["blue", "green", "red"]
    function crearPaleta(paleta) {
        x = 0;
        for (let i = 0; i < paleta.length; i++) {
            pincel.fillStyle = paleta[i]
            pincel.fillRect(x, 0, dimensionPaleta, dimensionPaleta)
            x += dimensionPaleta
        }
    }
    crearPaleta(paleta)

    let color = "blue"

    function cambiarColor(evento) {
        let x = evento.pageX - pantalla.offsetLeft;
        let y = evento.pageY - pantalla.offsetTop;
        console.log(x)
        console.log(y)

        if ((x <= dimensionPaleta) &&
            (y <= dimensionPaleta)) {
            color = (paleta[0])
            console.log(color)
        }
        if ((x > dimensionPaleta) &&
            (x <= dimensionPaleta * 2) &&
            (y <= dimensionPaleta)) {
            color = (paleta[1])
            console.log(color)
        }
        if ((x > dimensionPaleta * 2) && (x < dimensionPaleta * 3) &&
            (y <= dimensionPaleta)) {
            color = (paleta[2])
            console.log(color)
        }
    }


    pantalla.onclick = cambiarColor;

    function dibujarCirculo(evento) {

        if (puedoDibujar) {
            var x = evento.pageX - pantalla.offsetLeft;
            var y = evento.pageY - pantalla.offsetTop;
            pincel.fillStyle = color;
            pincel.beginPath();
            if (x > dimensionPaleta * paleta.length || y > dimensionPaleta) {
                pincel.arc(x, y, 5, 0, 2 * 3.14);
            }

            pincel.fill();
        }

    }

    pantalla.onmousemove = dibujarCirculo;
    function habilitarDibujar() {
        puedoDibujar = true;
    }

    function deshabilitarDibujar() {
        puedoDibujar = false;
    }

    pantalla.onmousedown = habilitarDibujar;

    pantalla.onmouseup = deshabilitarDibujar;

</script>
3 respuestas
solución!

Hola Julián, Está perfecto lo que hiciste. La única optimización que veo, es que si hay una paleta de colores más grande, podrías usar un ciclo for para preguntar por los colores. De esa manera tendrías un solo if

Sería algo como lo siguiente:

function cambiarColor(evento) {
    let x = evento.pageX - pantalla.offsetLeft;
    let y = evento.pageY - pantalla.offsetTop;

    let paletaInicialX = 0;
    let paletaFinalX = dimensionPaleta

    for(let i = 0; i < paleta.length; i++){
        if ((x > paletaInicialX) && (x <= paletaFinalX) && (y <= dimensionPaleta)) {
            color = (paleta[i])
            console.log(color)
        }

        paletaInicialX += dimensionPaleta
        paletaFinalX += dimensionPaleta
}

Muchas gracias Gonzalo , yo habia pensado algo similar pero no pude llevarlo a cabo , pero ya vi el porque. Gracias

Por nada, me alegro haber podido ayudar. Una abrazo!