Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Meu código: por que às vezes a cor troca corretamente e às vezes não?

Boa tarde!

Gostaria de entender porque o meu código não está funcionando corretamente. Se seleciono as cores na ordem (primeiro vermelho, depois verde e depois azul), funciona tudo certo. Porém, quando começo a selecioná-las aleatoriamente, às vezes troca e às vezes não. Tentei com um, dois cliques e não consigo entender porque isso acontece. Alguém poderia me ajudar?

Obrigada!

<meta charset="UTF-8">

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

<script>

    function desenhaQuadrado(x, y, tamanho, cor) {
        pincel.fillStyle = cor;
        pincel.fillRect(x, y, tamanho, tamanho)
        pincel.fill();
    }

    function desenhaCirculo(x, y, raio, cor) {
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * 3.14);
        pincel.fill();
    }

    function desenhaPaletaDeCores() {
        desenhaQuadrado(xVermelho, yQuadrados, tamanhoQuadrados, 'red');
        desenhaQuadrado(xVerde, yQuadrados, tamanhoQuadrados, 'green');
        desenhaQuadrado(xAzul, yQuadrados, tamanhoQuadrados, 'blue');
    }

    function lidaComMovimentoDoMouse(evento) {
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;

        if(desenha) {
            if ((x >= xVermelho) && (x < xVermelho+50) && (y >= yQuadrados) && (y <= tamanhoQuadrados)) {
                corAtual = 'red';
                desenha = false;
        } 
            if ((x >= xVerde) && (x < xVerde+50) && (y >= yQuadrados) && (y <= tamanhoQuadrados)) {
                corAtual = 'green';
                desenha = false;
        } 
            if ((x >= xAzul) && (x < xAzul+50) && (y >= yQuadrados) && (y <= tamanhoQuadrados)) {
                corAtual = 'blue';
                desenha = false;
        }      
            desenhaCirculo(x, y, 5, corAtual);
        }
    }

    function habilitaDesenhar() {
        desenha = true;
    }

    function desabilitaDesenhar() {
        desenha = false;
    }

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = 'lightgray';
    pincel.fillRect(0, 0, 600, 400);

    var desenha = false;
    var corAtual = 'blue';
    var xVermelho = 0;
    var xVerde  = 50;
    var xAzul = 100;
    var yQuadrados = 0;
    var tamanhoQuadrados = 50;

    desenhaPaletaDeCores(); // mostra os quadrados de seleção de cores

    tela.onmousemove = lidaComMovimentoDoMouse;
    tela.onmousedown = habilitaDesenhar;
    tela.onmouseup = desabilitaDesenhar;

</script>
4 respostas

Coloquei o código que mudava as cores em desabilitaDesenhar e parece estar ok.

    function lidaComMovimentoDoMouse(evento) {
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;

        if(desenha) {
            desenhaCirculo(x, y, 5, corAtual);
        }
    }


    function desabilitaDesenhar(evento) {
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        if ((x >= xVermelho) && (x < xVermelho+50) && (y >= yQuadrados) && (y <= tamanhoQuadrados)) {
            corAtual = 'red';
        } 
        if ((x >= xVerde) && (x < xVerde+50) && (y >= yQuadrados) && (y <= tamanhoQuadrados)) {
            corAtual = 'green';
        } 
        if ((x >= xAzul) && (x < xAzul+50) && (y >= yQuadrados) && (y <= tamanhoQuadrados)) {
            corAtual = 'blue';
        }
        desenha = false;
    }

Testei seu código e, quando seleciono uma cor, ele pinta logo ao mexer o mouse, sem precisar clicar. Mas valeu a tentativa.

solução!

Olá Luana, boa tarde! Então..

Na sua função lidaComMovimentosDoMouse, eu retirei a parte de alterar as cores e defini em outra função. Deixei apenas para iniciar o desenho e coloquei um "IF" para impedir de desenhar em cima da paleta.

Criei a função alteraCor e inseri quase toda a parte que estava em lidaComMovimentosDoMouse, tirei a segunda parte do Y e inclui para ativar a função no clicar do mouse.

Aqui deu certo o/

<meta charset="UTF-8">

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

<script>

    function desenhaQuadrado(x, y, tamanho, cor) {
        pincel.fillStyle = cor;
        pincel.fillRect(x, y, tamanho, tamanho)
        pincel.fill();
    }

    function desenhaCirculo(x, y, raio, cor) {
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * 3.14);
        pincel.fill();
    }

    function desenhaPaletaDeCores() {
        desenhaQuadrado(xVermelho, yQuadrados, tamanhoQuadrados, 'red');
        desenhaQuadrado(xVerde, yQuadrados, tamanhoQuadrados, 'green');
        desenhaQuadrado(xAzul, yQuadrados, tamanhoQuadrados, 'blue');
    }

    function lidaComMovimentoDoMouse(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;

        if((x >= xVermelho) && (x < 3 * tamanhoQuadrados) && (y < tamanhoQuadrados)){

            desenha = false
        }

        if(desenha){

        desenhaCirculo(x, y, 5, corAtual);

        }
    }

    function alteraCor(evento){

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;

            if ((x >= xVermelho) && (x < xVermelho+50) && (y < tamanhoQuadrados)){
                corAtual = 'red';

        } 
            if ((x >= xVerde) && (x < xVerde+50) && (y < tamanhoQuadrados)) {
                corAtual = 'green';

        } 
            if ((x >= xAzul) && (x < xAzul+50) && (y < tamanhoQuadrados)) {
                corAtual = 'blue';

        }      
    }

    function habilitaDesenhar() {
        desenha = true;
    }

    function desabilitaDesenhar() {
        desenha = false;
    }

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    pincel.fillStyle = 'lightgray';
    pincel.fillRect(0, 0, 600, 400);

    var desenha = false;
    var corAtual = 'blue';
    var xVermelho = 0;
    var xVerde  = 50;
    var xAzul = 100;
    var yQuadrados = 0;
    var tamanhoQuadrados = 50;

    desenhaPaletaDeCores(); // mostra os quadrados de seleção de cores

    tela.onmousemove = lidaComMovimentoDoMouse;
    tela.onmousedown = habilitaDesenhar;
    tela.onmouseup = desabilitaDesenhar;
    tela.onclick = alteraCor

</script>

Anderson, obrigada! :)

Acho que meu erro foi querer fazer tudo em apenas uma função: mudar as cores e desabilitar o pincel nos quadrados. Ainda tenho dificuldade em pensar em funções... mas uma hora chego lá!