Olá pessoal, estou tentando fazer uma desafio de um curso, ele propões em fazer um mini game onde um alvo aparece aleatoriamente na tela e você tem que clicar nele antes que desapareça, a parte de ele aparecer aleatoriamente já consegui fazer, meu problema é em detectar o click em cima dela, tentei fazer com o código a seguir mas acontece que ele dispara o alert no começo da execução dele, sem eu clicar em nada.
<canvas id="tela" width="600" height="400">
<meta charset="UTF-8">
<script>
var tela = document.getElementById("tela");
var c = tela.getContext("2d");
var imagem = new Image();
imagem.src="alvo.png";
var Imagem = function(x,y) {
c.drawImage(imagem,x,y)
}
var limpa = function() {
c.clearRect(0,0,600,400);
}
var sorteia = function() {
var x = Math.round(Math.random()*550);
var y = Math.round(Math.random()*350);
limpa();
Imagem(x,y);
}
var clicou = function() {
alert("Você acertou");
}
setInterval(sorteia, 3000);
imagem.onclick = clicou();
</script>
Não sei se entendi exatamente, mas se vc quiser detectar o clique na imagem, da pra usar o onClick event do jquery;
$("#id-da-sua-imagem-na-tela").on('click', function(){
alert("Você acertou");
});
Olá Luis,
acontece que você está criando uma imagem dentro do contexto de um canvas, então ela não está como um elemento DOM e sim, um elemento dentro do seu canvas. São dois contextos diferentes. Em segundo lugar, a sua função clicou
é executada, pois você está passando a execução dela ao evento “onclick de imagem” - que nesse caso não é disparada pois não existe nesse contexto. Tanto que para tal, você utilizaria document.getElementByName('img')
ou algo do tipo.
Faça a seguinte modificação:
var clicou = function(evento) {
console.log(evento)
alert("Você acertou");
}
tela.onclick = clicou
Abra a console do seu navegador e você vai notar que contém informações do evento MouseEvent
ou seja, é possível capturar a posição do mouse, ao clicar no canvas. Bom, como é um desafio, vou deixar você sugerir o que fazer agora que sabe onde o mouse está e as coordenadas X e Y que você usa dentro da função sorteia

Outra sugestão seria mudar a abordagem. Ao invés de usar canvas, poderia usar o HTML mesmo, criando uma imagem, “appendando” ela ao body e modificando a posição do css, via javascipt, daí você estaria no contexto do DOM, podendo fazer do desse jeito que quer.
