1
resposta

[Bug] Não consigo achar o erro

os alvos aparecem normalmente, de maneira aleatória e de acordo com o intervalo solicitado, mas não consigo detectar o clique do mouse no centro do alvo

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 x = evento.pagey - tela,offsetTop

        if((x > xaleatorio -raio) 
        && (x < xaleatorio + raio) 
        && (y > yaleatorio -raio) 
        && (y < yaleatorio + raio)) {

            alert('Acertou!')

        }
    }


    tela.onclick = dispara





</script>
1 resposta

Oi Nicolas, tudo bem?

Obrigado pela paciência em aguardar uma resposta!

Entendi sua dúvida. Dei uma olhada no seu código e percebi que na função dispara() você escreveu as variáveis da seguinte maneira:

    var x = evento.pagex - tela,offsetLeft
    var x = evento.pagey - tela,offsetTop

Observe que você trocou a variável “y” pela variável “x” e colocou vírgula no lugar do ponto ao escrever tela,offsetLef e tela,offsetTop.

Segue o código corrigido:

    var x = evento.pagex - tela.offsetLeft
    var y = evento.pagey - tela.offsetTop

Há outros detalhes que podem ser melhorados no seu código.

Para manter as boas práticas na escrita dos comandos, deve-se acrescentar ao final de cada linha um ponto e vírgula (;), Por convenção, também é recomendado escrever a partir da segunda palavra, a primeira letra em maiúsculo.

Notei que ao criar as variáveis xAleatorio e yAleatorio você não atribuiu a propriedade sorteiaPosicao(600) para "x" e sorteiaPosicao(400) para "y", algo importante mais adiante.

Também devo acrescentar que na primeira linha do seu código você não utilizou o sinal de menor no começo do comando para a criação do canvas.

O código com todas as correções mencionadas segue abaixo:

<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 = sorteiaPosicao(600);
    var yAleatorio = sorteiaPosicao(400);

    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>

Espero ter ajudado. Caso tenha dúvidas, estarei à disposição para te ajudar!

Grande abraço e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado! ✓.