1
resposta

Como faço para o código da colisão funcionar no jogo Freeway?

Está tudo certo, mas as colisões estão acontecendo de forma errada.

let xAtor = 100;
let yAtor = 366;
let lAtor = 30;
let aAtor = 30;
let raio = 7.5;

function mostraAtor(){
  image(imagemDoAtor, xAtor, yAtor, lAtor, aAtor);
}

function movimentaAtor(){
   if (keyIsDown(UP_ARROW)){
    yAtor -= 2.5;
    } 
     
   if (keyIsDown(DOWN_ARROW)){
     yAtor += 2.5;
   }    
}

function verificaColisao (){
  for (let i = 0; i < imagensCarros.length; i = i + 1){
    
if (xAtor + raio > xCarros[i] + lCarros[i] && 
    yAtor - raio < yCarros[i] + aCarros &&
   yAtor + raio > yCarros[i]){
   colidiu();
}
}  
  }

function colidiu (){
  yAtor = 366;
}
1 resposta

Oi, João! Tudo bem?

Vamos dar uma olhada no seu código e ajustar a lógica de detecção de colisão.

Primeiro, parece que há um pequeno erro na lógica de colisão. A condição xAtor + raio > xCarros[i] + lCarros[i] está verificando se o ator está à direita do carro, mas deveria verificar se ele está à esquerda. Além disso, você não está verificando a colisão no eixo X corretamente. Vou sugerir uma correção para a função verificaColisao.

Aqui está uma versão ajustada da função verificaColisao:

function verificaColisao() {
  for (let i = 0; i < imagensCarros.length; i++) {
    let colisao = collideRectCircle(xCarros[i], yCarros[i], lCarros[i], aCarros[i], xAtor, yAtor, raio * 2);
    if (colisao) {
      colidiu();
    }
  }
}

Para que essa função funcione, você precisa incluir a biblioteca p5.collide2d no seu projeto. Essa biblioteca facilita a detecção de colisões entre diferentes formas geométricas. Você pode incluí-la no seu HTML da seguinte forma:

<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/addons/p5.collide2d.min.js"></script>

A função collideRectCircle verifica a colisão entre um retângulo (o carro) e um círculo (o ator), simplificando bastante a lógica de colisão.

Espero ter ajudado e bons estudos!

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