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

Dificuldade em alterar o código para mudar FORMA

Estou tentando seguir a mesma linha de raciocínio do exercício, mas para mudar a forma ao clicar com o botão direito, mas infelizmente não estou conseguindo... já tentei de algumas maneiras mas não encontro o caminho correto...

<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 formas = [desenhaCirculo, desenhaQuadrado]
    var indiceForma = 0; 

    function desenhaCirculo(evento) {

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

    }

    function desenhaQuadrado (evento) {

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = "black";
        pincel.fillRect (x, y, 10, 10);

    }

    tela.onclick = desenhaCirculo, desenhaQuadrado;


    function mudaForma (){

       indiceForma++;

        if(indiceForma >= formas.length ) {

            desenhaCirculo(evento);
            indiceForma = 0;

        } 

        return false;

    }


    tela.oncontextmenu = mudaForma;


</script>
2 respostas
solução!

Olá amigo, boa tarde!

Gostei da sua ideia, veja se era isso que estava tentando fazer. Comentei no código os ajustes que fiz. Abraços e bons estudos!

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


<script>

    var tela = document.querySelector('canvas');
    var pincel = tela.getContext('2d');
    //Mudei a cor do canvas com CSS, alterando a propriedade background color. É mais simples que mudar o fillStyle e depois ter que fazer um quadrado.
    tela.style="background-color: grey;"

    var formas = [desenhaCirculo,desenhaQuadrado]
    var indiceForma = 0; 

    //criei uma função auxiliar, que vai receber o evento do mouse e as coordenadas X e Y. Assim evita código duplicado (observe que no seu código, para cada forma que incluisse, teria que repetir o var x/var y/pincel.fillStyle,etc...)

    function desenhaGenerico(evento){
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        pincel.fillStyle = "black";
        //nesse ponto, a função desenhaGenerico vai chamar o elemento dentro da Array "formas" de acordo com o índice atual. Como os elementos da array são funções, eles vão receber os parâmetros (x,y) ao serem chamados.
        formas[indiceForma](x,y);
    };

    function desenhaCirculo(x,y) {
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * 3.14);
        pincel.fill();
    };

    function desenhaQuadrado (x,y) {
        pincel.fillRect (x, y, 15, 15);
    };

    tela.onclick = desenhaGenerico;

    function mudaForma (){
        //simplifiquei essa parte com um operador ternário
        indiceForma < formas.length -1 ? indiceForma++ : indiceForma = 0;

        return false;
    };

    tela.oncontextmenu = mudaForma;

</script>

Era isso mesmo, muito obrigado! Consegui entender como você fez, mas ainda deu uma embaralhada na cabeça rsrs! Obg