3
respostas

[Dúvida] ultimo circulo desenhado altera junto com o quadrado indicativo

Ola, estava tentando melhorar esse projeto, criando um quadrado indicativo da cor atual do desenho, mas ao alterar a cor selecionada o ultimo círculo desenhado altera para a nova cor selecionada.

Exemplo, se estou desenhando em azul, quando seleciono a cor verde, o ultimo circulo desenhado em azul muda para verde.

Não consegui entender o motivo.

alguem consegue me ajudar?

<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 >= 0 && x < 150 && y >= 0 && y < 50) {

            desenha = false }

            else if (desenha) 

            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;


    function selecionaCor (evento){ 

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

        if (x >= 0 && x < 50 && y >= 0 && y < 50) {

            corAtual = 'red'
            
            desenhaQuadrado(550, 0, 50, corAtual);

        } else if(x >= 50 && x < 100 && y >= 0 && y < 50) {

            corAtual = 'green'
            
            desenhaQuadrado(550, 0, 50, corAtual);

        } else if(x >= 100 && x < 150 && y >= 0 && y < 50) {

            corAtual = 'blue';

            desenhaQuadrado(550, 0, 50, corAtual);
        }

    }

    tela.onclick = selecionaCor;

    desenhaQuadrado(550, 0, 50, corAtual);

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

    tela.onmousemove = lidaComMovimentoDoMouse;

    tela.onmousedown = habilitaDesenhar;

    tela.onmouseup = desabilitaDesenhar;

</script>
3 respostas

O problema que você está enfrentando ocorre porque você está desenhando o quadrado indicativo da cor no mesmo contexto em que está desenhando os círculos. Portanto, quando a cor é alterada, o último círculo desenhado também é afetado, pois ambos compartilham o mesmo contexto de desenho.

Uma solução para isso é criar um contexto separado para o quadrado indicativo da cor. Aqui está uma modificação no seu código para alcançar isso:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Desenhando com Cores</title>
</head>
<body>

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

<script>

    var tela = document.getElementById('myCanvas');
    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;

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

    function desenhaCirculo(x, y, raio, cor) {
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * Math.PI);
        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 >= 0 && x < 150 && y >= 0 && y < 50) {
            desenha = false;
        } else if (desenha) {
            desenhaCirculo(x, y, 5, corAtual);
        }
    }

    function habilitaDesenhar() {
        desenha = true;
    }

    function desabilitaDesenhar() {
        desenha = false;
    }

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

        if (x >= 0 && x < 50 && y >= 0 && y < 50) {
            corAtual = 'red';
        } else if (x >= 50 && x < 100 && y >= 0 && y < 50) {
            corAtual = 'green';
        } else if (x >= 100 && x < 150 && y >= 0 && y < 50) {
            corAtual = 'blue';
        }

        // Limpa o quadrado indicativo anterior e desenha o novo
        pincel.clearRect(550, 0, 50, 50);
        desenhaQuadrado(550, 0, 50, corAtual);
    }

    tela.onclick = selecionaCor;
    desenhaPaletaDeCores(); // Mostra os quadrados de seleção de cores
    tela.onmousemove = lidaComMovimentoDoMouse;
    tela.onmousedown = habilitaDesenhar;
    tela.onmouseup = desabilitaDesenhar;

</script>

</body>
</html>

Nesta versão, criei um contexto separado para desenhar o quadrado indicativo da cor. O método clearRect é usado para limpar a área do quadrado antes de desenhar o novo quadrado na cor selecionada. Isso garante que o quadrado indicativo não interfira nos círculos desenhados.

muito obrigado!!!!

bem simples e esclarecedor!

Fico contente por ter contribuído para esclarecer a sua dúvida. Estou à disposição para qualquer outra questão!

Um abraço,

Se este post foi útil, por favor, considere marcá-lo como solucionado ✓. Desejo a você excelentes estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software