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

[Dúvida] FREEWAY: colisão do ator com os carros

Olá gente, preciso de ajuda com uma situação, meu código está todo certinho, como mostra no curso... meu personagem se move, colide com os carros, marca pontos, volta a posição inicial e etc...

PORÉM estou com um problema muito chato que não consigo resolver de maneira alguma:

-->Quando meu Ator colide com Carros, algumas partes do meu Ator colide e outras não, a parte de cima do meu Ator as vezes colide mesmo nem tido tocado em algum carro, parece que o sistema está interpretando a colisão de forma errada ou algo assim com o meu Ator... Parece que meu Ator (como se fosse um círculo, digamos assim) esta com o eixo central dele desregulado/fora do lugar correto... Esse parece estar sendo o problema, porém não sei como resolver, mudar o eixo do meu Ator para que a colisão fique certinha...

Como posso fazer para solucionar isso?? Me deem um HELP...

//código do ator

let xAtor = 100;
let yAtor = 366;
let colisao = false;
let meusPontos = 0;

function mostraAtor() {
  image(imagemAtor, xAtor, yAtor, 30, 30);
}

function movimentaAtor() {
  if (keyIsDown (UP_ARROW)) {
    yAtor -= 3;
  }
if (keyIsDown (DOWN_ARROW)) {
  if (podeSeMover()){
    yAtor += 3;
    }
  }
  
if (keyIsDown(RIGHT_ARROW)){
 if (moveRight()){    
     xAtor += 3;
  }
 }  

  if(keyIsDown(LEFT_ARROW)){
  if(moveLeft()){  
    xAtor -= 3;
  }
 }
}

function verificaColisao() {
  for (let i = 0; i < imagemCarros.length; i ++ ){
    colisao = collideRectCircle(xCarros[i], yCarros[i],  comprimentoCarros, alturaCarros, xAtor, yAtor, 15)
    if (colisao)  {
      voltaPosicaoInicial ();
      if (pontosMaiorQueZero()) {
        meusPontos -= 1;
      }
    }
  }
}

function voltaPosicaoInicial() {
  yAtor = 366;
  xAtor = 100;
}

function incluiPontos () {
  stroke(0);
  textAlign(CENTER);
  textSize(24);
  fill('#f28a29')
  text(meusPontos, 250, 27);
}

function marcaPonto() {
  if (yAtor < 15) {
    meusPontos += 1;
    voltaPosicaoInicial();
  }
}

function pontosMaiorQueZero() {
  return meusPontos > 0;
}

function podeSeMover() {
  return yAtor < 366;
}

function moveRight() {
  return xAtor < 470;
}

function moveLeft() {
  return xAtor > 0
}


2 respostas
solução!

Olá, Flavia!

Tudo bem?

Uma maneira de tentar resolver isso seria ajustar os parâmetros que você passa para a função collideRectCircle para refletir mais precisamente a forma e o tamanho do ator. Por exemplo, se o ator é mais parecido com um retângulo do que com um círculo, você poderia usar a função collideRectRect em vez disso.

No seu caso, você poderia tentar ajustar o último parâmetro da função collideRectCircle, que é o diâmetro do círculo. Tente reduzir esse valor para ver se a detecção de colisão fica mais precisa. Aqui está como ficaria:

colisao = collideRectCircle(xCarros[i], yCarros[i], comprimentoCarros, alturaCarros, xAtor, yAtor, 10);

Nesse exemplo, eu mudei o diâmetro do círculo de 15 para 10. Você pode precisar ajustar esse valor até encontrar um que funcione bem para o seu jogo.

Espero ter ajudado e bons estudos!

Solução simples e funcional!! Muito obrigado!!