Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Bug] Mostra colisão sem nem tocar no carro

Bom dia. Eu estou tentando arrumar a parte da colisão com o carro, mas sem nem tocar nele, o animal já volta pro início. Eu tentei mudar o tamanho dos carros e do animal, mas não funcionou e não consegui achar erro nenhum no código. Link para o meu código: https://editor.p5js.org/ferdots/sketches/KtkgZFnOk

3 respostas

Olá Fernando, tudo bem?

Pelo código que você compartilhou, parece que a função colidiu() é chamada sempre que há uma colisão entre o ator e um dos carros, independentemente de qual carro seja. Isso faz com que, ao colidir com qualquer carro, o ator sempre volte para a posição original, independentemente de qual carro tenha sido atingido.

Para corrigir isso, você pode passar como parâmetro para a função colidiu() o índice do carro que colidiu com o ator. Assim, você pode fazer com que o ator volte para a posição original apenas quando colidir com um carro específico.

Para fazer isso, você pode alterar a função verificaColisao() para passar o índice do carro que colidiu para a função colidiu(), assim:

function verificaColisao(){
  for(let i=0; i<imagemCarros.length;i=i+1){
    if(collideRectCircle(xCarros[i],yCarros[i],comprimentoCarro, alturaCarro, xAtor, yAtor, 15)){
      colidiu(i); // passa o índice do carro que colidiu para a função colidiu()
    }
  }
}

E a função colidiu() deve ser alterada para receber esse índice como parâmetro e verificar se o ator colidiu com o carro correto:

function colidiu(indiceCarro){
  if(indiceCarro == carroAtual){ // verifica se o ator colidiu com o carro correto
    yAtor=355; // volta para a posição original
  }
}

Note que nesse exemplo, estou assumindo que a variável carroAtual é a que indica qual carro é o correto para colisão. Se isso não estiver correto, você pode substituir pelo nome correto da variável que guarda essa informação no seu código.

solução!

Olá Otávio, obrigado pela ajuda. Eu não consegui fazer dar certo com suas mudanças no código, mas eu parei para pensar e vi que fazia mais sentido eu usar um collideRectRect do que o RectCircle, já que meu personagem se tratava mais de um retângulo do que de um círculo. Não sei se o meu raciocínio está certo, mas aparentemente está funcionando direito agora.

Olá Fernando,

Fico feliz em saber que você conseguiu resolver o problema. Utilizar a função collideRectRect faz sentido se o seu personagem é representado por um retângulo. Essa função verifica a colisão entre dois retângulos e pode ser mais adequada para o seu caso.

Cada jogo pode ter suas particularidades e diferentes formas de tratar as colisões. O importante é escolher a função de colisão correta de acordo com a forma dos objetos envolvidos.

Se o seu código está funcionando corretamente agora com a utilização da função collideRectRect, então você fez a escolha adequada para o seu caso. Lembre-se sempre de testar e validar o comportamento do seu jogo para garantir que as colisões estão sendo tratadas corretamente.

Se tiver mais alguma dúvida ou precisar de ajuda adicional, estou à disposição. Boa continuação nos seus estudos e desenvolvimento do jogo!