Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Perde de mais de 1 ponto na colisão

https://editor.p5js.org/Targaryen/sketches/p5nJH3wZ5

Bom dia,

Depois que possuo mais de 1 ponto e ocorre a colisão do meu ator quando ele está se movimentando, meus pontos acabam sendo zerados ou diminuídos mais de 1.

Quando o ator está parado e ocorre a colisão, perde apenas 1 ponto corretamente mas no movimento da seta pra cima mais de 1 ponto é perdido na colisão, como se tivesse acontecido a colisão mais de 1 vez.

1 resposta

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.