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

Quando clico na tela tenho as posições x e y, mas não consigo mostrar a cor da boinha na tela, gostaria de saber se estou no caminho certo ?

5 respostas

Sim, aparentemente sim, mas não consigo dizer algo concreto sem ver o codigo

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

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

    function desenhaCirculo(evento, cor) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }


    function mudaCor(cores) {
        var contador = 0;

        while(contador < cores.length){    
            tela.onclick = desenhaCirculo(evento, cores[i]);
            contador++;
            alert('Funcionou!');
        }

        return false;
    }

    var cores = ['blue', 'red', 'green'];
    tela.oncontextmenu = mudaCor(cores);

</script>

Josemar, o problema esta aqui:

tela.oncontextmenu = mudaCor(cores);

Para eventos e, oncontextmenu é um evento, você precisa chamar uma função que é atribuída à tela.oncontextmenu. No entanto, veja que você passou o resultado da função mudaCor porque invocou a função com parênteses passando a lista de cores como parâmetro. Como o retorno é false você estará gravando false em. tela.oncontextmenu.

A primeira mudança a ser feita é:

tela.oncontextmenu = mudaCor;

Veja que agora tela.oncontextmenu recebe a função, seu código e não seu resultado. É como se tela.oncontextmenu passasse a ser a função mudaCor.

Quando o botão é clicado o navegador sem você ver chama a função armazenada em tela.oncontextmenu. Mas temos um problema.

Sua função muda cor não pode receber a lista de fotos como parâmetro porque o navegador só sabe chamar a função e não sabe passar o array de cores. Nesse sentido sua função mudaCor precisa mudar, por exemplo, não precisa receber cores como parâmetro. Variáveis declaradas fora de uma função é acessível diretamente dentro da função.

Outro ponto é que mostraCor não deve associar o evento onclick. Essa associação deve ser feita fora... Uma coisa é mudar cor outra coisa é desenhar na tela.

Aguardamos seu código modificado.

solução!

Josemar, segue um passo a passo das alterações que vou fazer no seu código. Estude-as com carinho!

1 - Seu código atual!

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

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

    function desenhaCirculo(evento, cor) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }


    function mudaCor(cores) {
        var contador = 0;

        while(contador < cores.length){    
            tela.onclick = desenhaCirculo(evento, cores[i]);
            contador++;
            alert('Funcionou!');
        }

        return false;
    }

    var cores = ['blue', 'red', 'green'];
    tela.oncontextmenu = mudaCor(cores);

</script>

Vou mudar a atribuição de tela.oncontextmenu que deve receber a função mudaCor e não o resultado de sua chamada. Também vamos remover o parâmetro cores!

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

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

    function desenhaCirculo(evento, cor) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }


    // mudei aqui, removi o parâmetro
    function mudaCor() {
        var contador = 0;

        while(contador < cores.length){    
            tela.onclick = desenhaCirculo(evento, cores[i]);
            contador++;
            alert('Funcionou!');
        }

        return false;
    }

    var cores = ['blue', 'red', 'green'];

    // mudei aqui
    tela.oncontextmenu = mudaCor;

</script>

3 - Agora vou extrair a associação de tela.onclick para fora de mudaCor. São duas coisas que acontecem em separado:

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

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

    function desenhaCirculo(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }



    function mudaCor() {
        var contador = 0;

        while(contador < cores.length){    

            contador++;
            alert('Funcionou!');
        }

        return false;
    }

    var cores = ['blue', 'red', 'green'];

    // veja que também não chamei a função desenhaCirculo, ela foi atribuída para tela.onclick

    tela.onclick = desenhaCirculo;
    tela.oncontextmenu = mudaCor;

</script>

4 - Toda vez que clicarmos com o botão direito o contador ser a zerado, não podemos fazer isso. É por isso que a variável contador vai ser declarada para fora do mudaCor e lá dentro ela será incrementada:

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

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

    var contador = 0; // declarei o contador fora das funções. Ele pode ser acessado dentro da função sem ser passado como parâmetro.

    function desenhaCirculo(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = cor;
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }



    function mudaCor() {

        // toda vez que o botão direito é clicado, incremento o contador e texto se cheguei na última cor. Se cheguei, volto o contador para zero 
        contador++;

        if(contador == cores.length) {
            contador = 0;
        }

        return false;
    }

    var cores = ['blue', 'red', 'green'];

    // veja que também não chamei a função desenhaCirculo, ela foi atribuída para tela.onclick

    tela.onclick = desenhaCirculo;
    tela.oncontextmenu = mudaCor;

</script>

5 - Ainda não esta pronto, vou organizar as variáveis, jogar a lista de cores lá para o topo, perto de contador. Vou alterar a função desenhaCirculo para acessar o array de cores levando em consideração o último contador atribuído pela função mudaCor chamada quando clico com o botão direito:

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

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

    var contador = 0; 
    var cores = ['blue', 'red', 'green'];

    function desenhaCirculo(evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        // aqui acesso o array de cores, levando em consideração a cor atual!

        pincel.fillStyle = cores[contador];

        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
        console.log(x + ',' + y);
    }



    function mudaCor() {

        // toda vez que o botão direito é clicado, incremento o contador e texto se cheguei na última cor. Se cheguei, volto o contador para zero 
        contador++;

        if(contador == cores.length) {
            contador = 0;
        }

        return false;
    }

    tela.onclick = desenhaCirculo;
    tela.oncontextmenu = mudaCor;

</script>

Sucesso e bom estudo meu aluno!

Josemar, não esquece de me dar um feedback sobre dúvidas que possam ter aparecido. Se esta tudo certinho, não esqueça de marcar minha resposta como solução.