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

Dúvidas Código Setinhas

Pessoal, vou colar abaixo o código de resolução da Aula 04-08. Mas tenho duas dúvidas sobre isso: 1) A tabela menciona alguns números (37, 38, 39, 40) com as variáveis cima, baixo, esquerda. Esse números são algum tipo de padrão do JS? Não faria mais sentido atribuir as variáveis às instruções ArrowRight, ArrowLeft.... que aparecem no console quando pressionamos as seta? 2) Quando, dentro da função leDoTeclado, reatribuímos o valor de x com acréscimo ou decréscimento da variável taxa, o "novo" x não deveria estar restrito somente à função? Ou quando fazemos qualquer alteração no var x ela fica disponível para código inteiro? Inclusive o desenhaCirculo() que irá utilizá-la? Isso significa que quando reatribuo um valor a uma variável, ela estará disponível no código todo?

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

<script>

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

    var x = 20;
    var y = 20;

    // códigos do teclado

    var esquerda = 37
    var cima = 38
    var direita = 39
    var baixo = 40

    var taxa = 10;

    function desenhaCirculo(x, y, raio) {

        pincel.fillStyle = 'blue';
        pincel.beginPath();
        pincel.arc(x, y, raio, 0, 2 * Math.PI);
        pincel.fill();
    }

    function limpaTela() {

        pincel.clearRect(0, 0, 600, 400);
    }


    function atualizaTela() {

        limpaTela();
        desenhaCirculo(x, y, 10);
    }

    setInterval(atualizaTela, 20);

    function leDoTeclado(evento) {

        if(evento.keyCode == cima) {

            y = y - taxa;

        } else if (evento.keyCode == baixo) {

            y = y + taxa;

        } else if (evento.keyCode == esquerda) {

            x = x - taxa;

        } else if (evento.keyCode == direita) {

            x = x + taxa;
        }
    }

   document.onkeydown = leDoTeclado;

</script>
2 respostas

Olá Leonardo, tudo bem com você?

Então, vamos la :)

1) A tabela menciona alguns números (37, 38, 39, 40) com as variáveis cima, baixo, esquerda. Esse números são algum tipo de padrão do JS? Não faria mais sentido atribuir as variáveis às instruções ArrowRight, ArrowLeft

Você está certo, realmente faz bem mais sentido! A questão é a compatibilidade com os navegadores, vou te mostrar:

  • O evento que você gostaria KeyboardEvent.code tem uma compatibilidade de 52,67% dos navegadores

  • O evento que utilizamos do keyCode tem uma compatibilidade de 97,7% com os navegadores

Então quando utilizamos o keyCode estamos tendo certeza que a grande maioria dos usuários irão conseguir utilizar o nosso programa, e os números para cada tecla realmente são um padrão da linguagem :)

Aos poucos essa compatibilidade irá ir aumentando e com o tempo iremos começar a utilizar mais o code dessa maneira:

        if(evento.code == "ArrowUp") {
            y = y - taxa;
    }

Entretanto, atualmente ainda é bom utilizar o valor de cada tecla :)

2) Quando, dentro da função leDoTeclado, reatribuímos o valor de x com acréscimo ou decréscimento da variável taxa, o "novo" x não deveria estar restrito somente à função?

Na verdade isso tem a ver com uma coisa chamada escopo de variável, vou te dar um exemplo:

var x = 30;
function teste() {
    var y = 50;
}

Como X está no mesmo escopo da função, podemos utilizar dentro dela o valor de X,

Agora como Y está restrito a função não podemos utilizar ela fora da função, pois não existe

Então no nosso caso, todas as variáveis que estão fora de uma função dentro da tag script, está no que chamamos de escopo global e todas as funções tem acesso ao valor dessa variável e podem alterar

Isso significa que quando reatribuo um valor a uma variável, ela estará disponível no código todo?

Na verdade é o ponto que citei a cima, ela já está disponível para o código todo por ser uma variável global, então qualquer função pode reatribuir o valor dela :)

Abraços e Bons Estudos!

solução!

Super bem respondido, Geovani! Obrigado!