5
respostas

Problema colisasão ator/carrinho

Durante o teste o ator colidia mesmo estando na posicao inicial. Descobri que a caixa de colisão e a imagens estavam deslocadas tanto em X quanto em Y. Qual seria a causa do problema?

5 respostas

Olá, Mateus! Tudo bem com você?

Ao relatar o problema, você já descobriu a causa também :)

De fato, se posicionarmos os atores em um ponto mas modificarmos os valores de altura ou largura por exemplo, a sensibilidade de colisão também precisará ser alterada. Vou utilizar o exemplo abaixo para exemplificar melhor;

No plano cartesiano temos as situações A e B, onde o losango e bola são os dois atores do jogo. Vejamos:

Imagem com o plano cartesiano apresentando duas situações, A e B. Na situação A temos dois atores com altura equivalente e com a mesma distância. Na situação B temos um ator maior que o outro, o que corresponde a uma distância menor entre eles

  • Situação A

A situação A corresponde às informações dadas pelo instrutor, pois os atores possuem altura e largura equivalentes. Nesse sentido, a sensibilidade de colisão também faz referência aos cálculos feitos durante a aula, o que caracteriza uma distância um pouco maior entre os dois atores.

Mas o que isso quer dizer?

Isso significa que nesta situação A, a colisão não será detectada nessa distância.

  • Situação B

Por outro lado, observamos no caso B que os valores de altura de um dos atores foi alterado para mais, o que o deixou ocupando um espaço maior no plano cartesiano. Dessa forma, o que acontece é que se o cálculo da função que detecta a colisão for o mesmo, a sensibilidade da colisão será maior e o programa irá entender que eles estão colidindo mesmo que visualmente (para o jogador) isso não ocorra.

Mas o que isso quer dizer?

Isso significa que no caso B, devido ao fato da altura do ator ocupar uma área maior no plano cartesiano, a colisão será detectada mesmo que exista visualmente uma distância significativa para o jogador.

Espero que as informações tenham ajudado!

Se as dúvidas persistirem, fico à disposição.

Se você puder compartilhar seu código, será ótimo também para visualizar problemas eventuais e sanar suas dúvidas (basta copiar o link do seu projeto no p5.js ou copiar o código e colar aqui no fórum)

Fico no aguardo, um abraço e bons estudos!!!

Insira aqui a descrição dessa imagem para ajudar na acessibilidade ! A imagem contém as 2 situações. No caso A ele considera que nao colidiu, mas no caso B ele considerou que colidiu. É como se a caixa de colisao do carro estivesse deslocaca para baixo. No caso eu arrumei tirando do paramentro y do carro na função collideRectCircle um valor. Gostaria de saber porque deu a caixa de colisao ficou deslocada.

Ah, sim. Agora entendi!

Provavelmente a verificação a partir da função CollideRectCircle é partir dessa área do caso B mesmo. Pelo o que pude observar na biblioteca, o método utilizado faz referência à borda inferior a partir da distância do raio e a lógica é essa: Se a distância é menor ou igual ao raio, haverá uma colisão! Mas o que pode estar ocorrendo é ele reconhecer a parte superior do ator vaca como o raio.

Você poderia compartilhar seu projeto no p5.js? Basta copiar o link do projeto e postar aqui no fórum. Dessa forma:

Imagem apontando para o Link do projeto no editor p5.js

Fico no aguardo, um abraço e bons estudos!

o link como foi pedido https://editor.p5js.org/mateus550/sketches/yZwg2Gd1S

Oi, Mateus!

Vi seu projeto e ficou excelente, parabéns mesmo!!!

Eu realmente não havia reparado nesse bug que você encontrou e trouxe ainda por cima a solução!

Vejo um futuro na carreira de game tester para você.

Sobre sua dúvida em relação ao problema na colisão. De fato, o posicionamento de uma imagem fica comprometido e, para que fique centralizado, é necessário especificar que: o ponto de início de seu desenho será o seu centro . Certamente é devido a essa situação que a colisão na parte superior do carro fica comprometida.

De acordo com a documentação oficial do p5.js, as imagens são desenhadas a partir do canto superior esquerdo. Nesse sentido, é preciso remanejar o ponto de partida do desenho. Você pode modificar tanto o ator vaca quanto os carros.

Para modificar o local em que as imagens são desenhadas, podemos utilizar o imageMode(CENTER) ou mesmo o imageMode(CORNERS). Com esse método é possível definir o ponto central na imagem ou estabelecer os seus cantos. Você fez isso através da subtração na função verificaColisao(), ao subtrair o y dos Carros com o yCarro[i]-23, ou seja, você subtrariu 23 na posição y dos carros e modificou o ponto de colisão, deixando-o com uma maior sensibilidade. Uma solução simplesmente genial!

Vou deixar aqui os links para referência sobre o funcionamento do p5.js

Espero que as informações tenham ajudado, fico à disposição!

Além disso, continue compartilhando suas soluções e projetos conosco, parabéns novamente!!

Um abraço e bons estudos!