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

Trocando de cor e limpando a tela

Acrescentei mais duas funcionalidades ao exercício proposto. Inseri outro elemento canvas para indicar qual a cor selecionada no momento e um botão para limpar a tela. Segue abaixo o código:

<canvas id="tela" width="600" height="400"></canvas>
<canvas id="indicador_cor" width="50" height="50"></canvas>

<button>Limpar Tela</button>

<script>
    var tela = document.querySelector("#tela");
    var pincel = tela.getContext("2d");

    var indicadorCor = document.querySelector("#indicador_cor");
    var pincelIndicadorCor = indicadorCor.getContext("2d");
    pincelIndicadorCor.fillStyle = "blue";
    pincelIndicadorCor.fillRect(0, 0, 50, 50);

    var button = document.querySelector("button");

    pincel.fillStyle = "gray";
    pincel.fillRect(0, 0, 600, 400);
    pincel.fillStyle = "blue";

    function desenhaCirculo(evento) {
        // console.log(evento);
        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        // console.log("Cliquei nas coordenadas:\nx = " + x + " e y = " + y);
        pincel.fillStyle = cores[posicao];
        pincel.beginPath();
        pincel.arc(x, y, 10, 0, 2 * Math.PI);
        pincel.fill();
    }

    function limpaTela() {
        pincel.fillStyle = "gray";
        pincel.fillRect(0, 0, 600, 400);
        pincel.fillStyle = "blue";
        posicao = 0;
        mudaIndicadorCor();
    }

    function mudaCor() {
        posicao++;
        if (posicao >= cores.length) {
            posicao = 0;
        }
        mudaIndicadorCor();
        return false;
    }

    function mudaIndicadorCor() {
        pincelIndicadorCor.fillStyle = cores[posicao];
        pincelIndicadorCor.fillRect(0, 0, 50, 50);
    }

    var cores = ["blue", "red", "green"];
    var posicao = 0;

    tela.onclick = desenhaCirculo;
    button.onclick = limpaTela;
    tela.oncontextmenu = mudaCor;
</script>

Apesar do código estar funcionando surgiram algumas dúvidas:

  1. Primeiramente tentei inserir o elemento canvas #indicador_cor dentro do elemento canvas #tela assim como também o botão de limpar tela para ficarem todos os elementos dentro do espaço de 600 x 400. Mas nenhum dos dois apareciam no navegador. É possível inserir outros elementos dentro do elemento canvas?

  2. Aprendi no curso de Lógica de Programação I que as funções devem vir em primeiro lugar dentro da tag de script. Alguns exemplos mostrados neste curso, assim como a resposta deste exercício, declaram algumas variáveis antes das funções. Pelo que percebi isso não interfere na execução do código. Isso realmente não tem relevância ou é uma boa prática iniciar com as funções?

  3. Apesar de estar funcionando a função limpaTela() abaixo

function limpaTela() {
        pincel.fillStyle = "gray";
        pincel.fillRect(0, 0, 600, 400);
        pincel.fillStyle = "blue";
        posicao = 0;
        mudaIndicadorCor();
    }

ela reconstroi novamente os elementos canvas #tela e canvas #indicador_cor. Não achei muito elegante essa solução. Haveria outra forma?

4 respostas
solução!

Olá André!!!!!!

Respondendo suas perguntas, meu aluno!

1 - Sim é, mas isso envolve outros conceitos mais complexos que ficaram de fora desse curso para não assustar o aluno. Eu utilizei o mínimo possível do canvas para que o aluno pudesse exercitar sua lógica de programação sem desanimar por causa de uma API complexa.

2 - Fui eu mesmo que te ensinei isso no curso de lógica 1, hehe! Fazemos isso por uma questão de organização, mas o no curso de lógica 2 eu achei melhor deixar as funções irem aparecendo ao longo do programa para que o aluno entenda passo a passo o que fez no código. Se não me engano, em um exercício eu comento isso e no finalzinho eu organizo o código colocando no início as funções. Sobre fazer diferença ou não é que o JavaScript antes de rodar seu código, iça (hoisting) suas funções para o início do arquivo, é por isso que funciona. Vejo aqui que tenho um aluno que encontrarei nos meus cursos avançados de JavaScript muito em breve :)

3 - Existe sim, mas a complexidade é exponencial e por isso não foi abordar nesse curso que foca mais na lógica de programação do que no canvas em si. Aprendemos o essencial do canvas para exercitar a lógica apenas. Mas a sua curiosidade com certeza o levará a aprender e quem sabe se especializar nessa API.

Tudo bem?

Ah, e parabéns pelo código e pelas perguntas. Acho que encontrarei um novo cangaceiro em JavaScript em breve!

Obrigado Flávio! Estou aprendendo muito com suas aulas e suas respostas estão me deixando com mais ânimo para seguir adiante! Em breve nos encontraremos nos cursos avançados de JavaScript!!

Excelente! Não precisa correr, mas também não pode ir devagar :) Com o lógica 2 terminado você já pode fazer o primeiro de JavaScript, a linguagem e depois um do jQuery do instrutor Douglas. Com esses dois cursos, já pode partir para os avançados (de ES6). É mais ou menos essa sequencia que eu indicaria.