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

Não compreendi a aplicação do "if"

<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 raio = 10;
    var xAleatorio;
    var yAleatorio;

    function desenhaCirculo(x, y, raio, cor) {

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

    }

    function limpaTela() {

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

    }

    function desenhaAlvo(x,y) {

        desenhaCirculo(x, y, raio+20, 'red');
        desenhaCirculo(x, y, raio+10, 'white');
        desenhaCirculo(x, y, raio, 'red');

    }

    function sorteiaPosicao(maximo) {

        return Math.floor(Math.random() * maximo);

    }

function atualizaTela() {
    limpaTela();
    xAleatorio = sorteiaPosicao(600);
    yAleatorio = sorteiaPosicao(400);
    desenhaAlvo(xAleatorio, yAleatorio);
}

setInterval(atualizaTela, 1000);

function dispara(evento) {

    var x = evento.pageX - tela.offsetLeft;
    var y = evento.pageY - tela.offsetTop;

    if((x > xAleatorio - raio)
    && (x < xAleatorio + raio)
    && (y > yAleatorio - raio)
    && (y < yAleatorio + raio)) {

        alert('Acertou!');

    }


}

tela.onclick = dispara;

</script>

No código acima são declaradas as variáveis "xAleatorio" e "yAleatorio" fora de qualquer função, as quais são utilizadas na função "dispara" como condicionais para que ao clicarmos no alvo da tela do canvas, um alerta seja acionado. Porém, considerando que as variáveis "xAleatorio" e "yAleatorio" não possuem qualquer valor, não entendi a ação delas quando se condiciona o "x" e o "y" a elas na função "dispara".

3 respostas

Oi Rafael tudo bem?

As variáveis "xAleatorio" e "yAleatorio" recebem valor na função "atualizaTela" e, essa função é chamada a cada 1 segundo (1000 milissegundos) pela função do Javascript "setInterval" na linha 51. Espero ter ajudado.

Mas considerando que ela foi valorada apenas na função atualizaTela, seus valores não deveriam ter efeito apenas nessa função, e não na dispara?

solução!

Se ela fosse declarada dentro da função "atualizaTela", seu valor só seria válido dentro dessa função (variável local). Como ela foi declarada fora de qualquer função(variável global), ela pode ser utilizada em qualquer lugar do código e, sofrer alterações de seus valores inclusive.