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

Solução código - DesenhaCirculo (evento.shiftKey)

Ola galera,

Segue meu código para o exercício proposto.

<h1>..:: Desenha Circulo Azul ::..</h1>
<canvas id="tela" width="600" height="400"></canvas>
<h3>Status</h3>
<table>
<tr><td>Cor do circulo (<font color="red">botão direito</font>)</td><td><input id="cor" size="2" value="blue"></td></tr>
    <tr><td>Incremento/Decremento com o botão <font color="red">Shift</font></td><td><input id="botaoShift" size="2" value="20"></td></tr>
</table>

<script>
    var tela = document.getElementById('tela');
    var lapis = tela.getContext('2d');

    lapis.fillStyle = 'grey';
    lapis.fillRect(0, 0, 600, 400);

    var cores = ['blue','red','green','white','yellow'];
    var idCor = 0; // começa com blue <input>

    function corCirculo() {
        idCor++;
        if (idCor >= cores.length) {
            idCor = 0;
        }
        var inputCor = document.getElementById('cor');
        inputCor.value = cores[idCor];
        return false;
    }

    tela.oncontextmenu = corCirculo;

    function desenhaCirculo(evento) {

        //Cor do circulo
        var corCirculo = document.getElementById('cor');
        console.log(corCirculo.value);

        //Valor do incremento para o botao Shift
        var incrementoCirculo = document.getElementById('botaoShift');
        console.log(incrementoCirculo.value);

       var x = evento.pageX - tela.offsetLeft;
       var y = evento.pageY - tela.offsetTop;
       lapis.fillStyle = corCirculo.value;
       lapis.beginPath();
       var raio = 10;
       if (evento.shiftKey == true) {
           raio = raio + parseInt(incrementoCirculo.value);
           console.log(raio)
       }
       lapis.arc(x, y, raio, 0, 2 * 3.14);
       lapis.fill();
       console.log(x + ',' + y);
    }

    tela.onclick = desenhaCirculo;
</script>
6 respostas

Oi Fabio! Pude ver como você personalizou o exercício possibilitando a troca de cores pelo usuário, inclusive o tamanho da bola. A parte de lógica esta ok e você investiu um pouco mais no que chamamos de manipulação de DOM que é manipular os elementos da página.

Se o caminho que você deseja traçar envolve a linguagem JavaScript, você encontrará novos desafios e novas formas de se resolver questões como essa que você resolveu.

Sucesso e bom estudo meu aluno!

Valeu, Flavio...

Tento sempre fazer alguma coisa diferente a cada exercício, pois não da para estudar tudo de uma vez. Desde jeito vamos absorvendo aos poucos e corrigindo os erros tbm.

Por exemplo, nos trabalhamos com o querySelector e ao longo dos estudos estou achando melhor trabalhar com o getElementById para manipular os elementos.

Como você disse o caminho é longo com muita coisas para aprender e durante o caminho acredito que vão aparecer outros elementos que ajudaram a resolver os problemas de formas diferentes.

solução!

Oi Fabio.

Esse é o caminho. Ficou legal seu exercício. Como melhoria, te indico tomar cuidado com as indentação do seu código e também tomar cuidado com os fechamentos de declarações com ponto e vírgula. Em JavaScript, caso você esqueça, na maioria dos casos o navegador saberá tratar. Contudo, considerando que você o utiliza e esqueceu em algumas declarações, aconselho sempre se atentar a isso, assim é uma certeza que você tem que separou bem as declarações.

Reescrevi uma parte do seu HTML de forma melhor indentada, veja se considera mais legível:

<table>
    <tr>
        <td>Cor do circulo (<font color="red">botão direito</font>)</td>
        <td><input id="cor" size="2" value="blue"></td>
    </tr>
    <tr>
        <td>Incremento/Decremento com o botão <font color="red">Shift</font></td>
        <td><input id="botaoShift" size="2" value="20"></td>
    </tr>
</table>

Um alternativa legal de trocar as cores é utilizar valores hexadecimais para as cores, obtidas de forma randômica. Olha só como eu alterei a sua função e agora você pode trabalhar com muito mais cores de forma bem randômica:

<h1>..:: Desenha Circulo Azul ::..</h1>
<canvas id="tela" width="600" height="400"></canvas>
<h3>Status</h3>
<table>
    <tr>
        <td>Cor do circulo (<font color="red">botão direito</font>)</td>
        <td><input id="cor" size="2" value="blue"></td>
    </tr>
    <tr>
        <td>Incremento/Decremento com o botão <font color="red">Shift</font></td>
        <td><input id="botaoShift" size="2" value="20"></td>
    </tr>
</table>

<script>
    var tela = document.getElementById('tela');
    var lapis = tela.getContext('2d');

    lapis.fillStyle = 'grey';
    lapis.fillRect(0, 0, 600, 400);

    //var cores = ['blue','red','green','white','yellow'];
    var corHexa = '#';

    function corCirculo() {
        var hexadecimais = '0123456789ABCDEF';
        corHexa = '#';

        for (var i = 0; i < 6; i++ ) {
            corHexa += hexadecimais[Math.floor(Math.random() * 16)];
        }

        document.getElementById('cor').value = corHexa;

        return false;
    }

    tela.oncontextmenu = corCirculo;

    function desenhaCirculo(evento) {

        //Cor do circulo
        var corCirculo = document.getElementById('cor').value;
        console.log(corCirculo);

        //Valor do incremento para o botao Shift
        var incrementoCirculo = document.getElementById('botaoShift');

        var x = evento.pageX - tela.offsetLeft;
        var y = evento.pageY - tela.offsetTop;
        lapis.fillStyle = corCirculo;
        lapis.beginPath();
        var raio = 10;

        if (evento.shiftKey == true) {
           raio = raio + parseInt(incrementoCirculo.value);
           console.log(raio);
        }

        lapis.arc(x, y, raio, 0, 2 * 3.14);
        lapis.fill();
        console.log(x + ',' + y);
    }

    tela.onclick = desenhaCirculo;
</script>

Com o tempo você vai conhecer diversas funções bacanas que são uma mão na roda, como no caso a Math.random(). Veja que utilizo ela sendo multiplicada por 16, gerando um número assim entre 0 e 15:

Math.floor(Math.random() * 16);

O número randomizado é retornado dentro de outra função bem bacana, a Math.floor(). Essa função retorna o inteiro mais próximo abaixo do número que a função receber. A função de randomizar pode devolver um valor 14.26, por exemplo, a a floor() mantém só o inteiro 14. Esse inteiro servirá como índice pro array hexadecimais[] que vai pegar o valor dessa posição na lista de caracteres 0123456789ABCDEF. Essa lista representa todos os valores que um caractere hexadecimal pode ter.

O que pode te confundir um pouco é a instrução for dentro do código. Caso não tenha visto ainda, logo verá no curso. Se trata de um laço para que o código crie uma repetição de execução até que uma condição seja atingida. Dessa forma, o laço no meu exemplo roda 6 vezes, pegando 6 caracteres da lista de hexadecimais que, somados ao # formam um código hexadecimal que pode ser usado para cores, como foi o caso.

Enfim, continue seus estudos que só tende a melhorar.

[]'s.

Excelente Bruno!

Bruno,

Rapaz ficou muito massa o requinte do hexadecimal no código. As poucos a gente vai aprendendo muita coisa bacana como essa sua.

Muito obrigado pela contribuição e dividir um pouco da sua experiencia.

Que bom que gostou, Fabio.

Por nada! Qualquer coisa, estamos por aqui.

[]'s.