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

O código funciona, mas o console indica erro.

Ainda que o código funcione conforme o exercício proposto, aparece a seguinte mensagem no console "Uncaught TypeError: Cannot read property 'pageX'".

Segue o código, caso seja necessário analisá-lo:

<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;
        var area;

        if(x < (3*tamanhoQuadrados)
            && y < tamanhoQuadrados) {
                area = false;
        } else {
                area = true;
        }

        if(desenha && area) {

            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 = 'pink';
    pincel.fillRect(0, 0, 600, 400);

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


    function mudaCor(evento) {

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


        if((x > xVermelho)
            && x < xVerde
            && y > yQuadrados
            && y < tamanhoQuadrados){
                corAtual = 'red';
        } else if(x > xVerde
            && x < xAzul
            && y > yQuadrados
            && y < tamanhoQuadrados){
                corAtual = 'green';
        } else if(x > xAzul
            && x < (xAzul + tamanhoQuadrados)
            && y > yQuadrados
            && y < tamanhoQuadrados) {
                corAtual = 'blue';
        }

        lidaComMovimentoDoMouse();

    }

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

    tela.onmousemove = lidaComMovimentoDoMouse;

    tela.onmousedown = habilitaDesenhar;

    tela.onmouseup = desabilitaDesenhar;

    tela.onclick = mudaCor;

</script>

2 respostas
solução!

Faaaalaaa Isadora, beleza ?

Você pode resolver este erro no console de duas formas. Irei explicar cada uma delas abaixo.

A primeira é apenas comentando a seguinte linha que está dentro da função mudaCor():

lidaComMovimentoDoMouse();

Isto porque você já chama a função lidaComMovimentoDoMouse() quando há movimentos do mouse ( em tela.onmousemove ) e a função mudaCor() quando há algum clique nas cores ( em tela.onclick = mudaCor ). Então, chamar a função lidaComMovimentoDoMouse() dentro de mudarCor() torna-se redundante.

A segunda forma, é passando o evento que você recebe como parâmetro na função mudaCor() para a chamada da função lidaComMovimentoDoMouse(), ficaria assim:

lidaComMovimentoDoMouse(evento);

Mas recomendo a primeira maneira, por tirar a redundância do código. Poderá testar as duas soluções.

Irei anexar o código logo abaixo para que você veja o que eu acabei de dizer:

<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;
        var area;

        if(x < (3*tamanhoQuadrados)
            && y < tamanhoQuadrados) {
                area = false;
        } else {
                area = true;
        }

        if(desenha && area) {

            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 = 'pink';
    pincel.fillRect(0, 0, 600, 400);

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


    function mudaCor(evento) {

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


        if((x > xVermelho)
            && x < xVerde
            && y > yQuadrados
            && y < tamanhoQuadrados){
                corAtual = 'red';
        } else if(x > xVerde
            && x < xAzul
            && y > yQuadrados
            && y < tamanhoQuadrados){
                corAtual = 'green';
        } else if(x > xAzul
            && x < (xAzul + tamanhoQuadrados)
            && y > yQuadrados
            && y < tamanhoQuadrados) {
                corAtual = 'blue';
        }

        //lidaComMovimentoDoMouse(); Deixar comentado ou tirar esta linha (1º solução)
        //lidaComMovimentoDoMouse(evento); // 2º solução


    }

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

    tela.onmousemove = lidaComMovimentoDoMouse;

    tela.onmousedown = habilitaDesenhar;

    tela.onmouseup = desabilitaDesenhar;

    tela.onclick = mudaCor;

</script>

Qualquer dúvida, estou a disposição. Espero ter ajudado. Bons estudos!!!

Boa noite, Nádia! Resolvi tirar a linha mesmo pra remover a redundância. Ótima explicação, valeu!