Fala ai Rafael, tudo bem? Não sei o motivo disso estar ocorrendo porque não cheguei a fazer o curso.
Mas, para resolver o problema eu criei uma função debounce
:
function debounce(fn) {
clearTimeout(timeout);
timeout = setTimeout(fn, 100);
}
Adicionei uma nova variável para salvar o agendamento atual da função:
let timeout = 0;
E por fim, na lógica que diminui o ponto eu usei a função debounce
:
debounce(function() {
meusPontos -=1;
})
O código completo fica:
//Codigo do Ator
let xAtor = 85;
let yAtor = 366;
let colisao = false;
let meusPontos = 0;
let timeout = 0;
function debounce(fn) {
clearTimeout(timeout);
timeout = setTimeout(fn, 100);
}
function mostraAtor(){
image(imagemDoAtor, xAtor, yAtor, 30, 30);
}
function movimentaAtor(){
if (keyIsDown(UP_ARROW)){
yAtor -= 3
}
if (keyIsDown(DOWN_ARROW)){
if(podeSeMover()){
yAtor += 3
}}}
function verificaColisao(){
//collideRectCircle(x1, y1, width1, height1, cx, cy, diameter)
for (let i = 0; i < imagemCarros.length; i++){
colisao = collideRectCircle(xCarros[i], yCarros[i], comprimentoCarro, alturaCarro, xAtor, yAtor, 15)
if (colisao){
voltaAtorParaPosicaoInicial();
somDaColisao.play();
if (pontosMaiorQueZero()){
debounce(function() {
meusPontos -=1;
})
}
}
}
}
function voltaAtorParaPosicaoInicial(){
yAtor = 366
}
function incluiPontos(){
textSize(25);
text(meusPontos, width / 5, 28);
textAlign(CENTER);
fill(255,70,60);
}
function marcaPonto(){
if (yAtor < 15){
meusPontos += 1;
somDoPonto.play();
voltaAtorParaPosicaoInicial();
}}
function pontosMaiorQueZero(){
return meusPontos > 0
}
function podeSeMover(){
return yAtor < 366;
}
O padrão debounce
é bem comum para esse tipo de necessidade, caso não conheça dá uma olhada nesse post:
https://blog.matheuscastiglioni.com.br/previnindo-multiplas-requisicoes-com-debounce/
Espero ter ajudado.