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

[Dúvida] Código de colisão com a raquete

A minha dúvida é simples, eu entendo como funciona o plano cartesiano e entendo a utilização de somar e subtrair o raio da bolinha. O que não me entra na cabeça é por que quando utilizamos o código yBolinha - raio < yRaquete + raqueteAltura no IF a bolinha bate na parede somente na parte de baixo da raquete. Se o yRaquete + raqueteAltura é maior (>) que o yBolinha - raio a raquete não deveria estar em baixo e a bolinha em cima? Afinal o yRaquete estaria maior naquele momento. Isso faz sentido para mim de acordo com o plano cartesiano no p5.js.

4 respostas
solução!

Oi Luiz, tudo beleza?

Isso acontece pois na função rect as coordenadas do retângulo não estão no meio dele, e sim no vértice superior esquerdo, onde ele se inicia.

Vamos revisar rapidamente como se comporta o plano cartesiano no P5.JS:

Imagem de um plano cartesiano simples. No vértice superior direito estão as coordenadas 0, 0. O eixo x está na parte de cima e cresce para a direita, até o número 6. O eixo y está na parte da esquerda e cresce para baixo, até o número 6

As coordenadas 0,0 estão na parte superior esquerda, e quanto mais para baixo, maior o y. Quanto mais à direita, maior o x. Veja, se eu crio um retângulo nas coordenadas 10, 10, com altura e largura 100:

function draw() {
  background(0);
  rect(10, 10, 100, 100);
}

Esse vai ser o resultado:

Um quadrado preto com um quadrado branco no canto superior direito. O quadrado branco ocupa mais ou menos um oitavo do quadrado maior. Há um espaço entre as arestas equivalente a 10 pixels. Não há nenhuma indicação de plano cartesiano na imagem, mas entende-se a partir do contexto da resposta

E, se eu fizer um retângulo com outras dimensões mas nas mesmas coordenadas?

function draw() {
  background(0);
  rect(10, 10, 150, 75);
}

O resultado é esse. Perceba que o retângulo se altera para os lados, mas suas coordenadas 10, 10 continuam no vértice superior esquerdo:

Um quadrado preto com um retângulo branco no canto superior direito. O retângulo branco ocupa mais ou menos um oitavo do quadrado. Há um espaço entre as arestas equivalente a 10 pixels. Não há nenhuma indicação de plano cartesiano na imagem, mas entende-se a partir do contexto da resposta. Há um x vermelho no vértice superior esquerdo, que representa as coordenadas 10,10

Sendo assim, conseguimos descobrir onde está yRaquete no nosso jogo: na ponta superior da raquete. Quando consideramos yRaquete + raqueteAltura o resultado será a ponta inferior da raquete, afinal no plano cartesiano do P5 o eixo y começa na parte de cima da tela, e quanto maior, mais para baixo. Já a função circle cria as coordenadas da bolinha a partir do seu centro, e utilizamos o raio para chegar a algum ponto externo da bolinha.

Um quadrado preto. Perto do centro há um círculo branco com um x vermelho marcando a parte mais superior. Logo acima está escrito y Bolinha menos raio. No lado direito há um retângulo branco representando a raquete do jogo Pong. Há um x vermelho no vértice esquerdo inferior e ao lado está escrito y Raquete mais raquete altura

O que estamos comparando nessa linha de código específica são as coordenadas da parte superior da bolinha e da parte inferior da raquete.

Então, quando a condição yBolinha - raio < yRaquete + raqueteAltura for verdadeira a bolinha estará acima da raquete ou em contato com ela, que é o que buscamos na função de colisão com a raquete em que essa condição é analisada, confirmando sua linha de raciocínio.

Porém, como essa linha de código é uma condição, não é ela que determina a ação que será executada. Essa condição terá um retorno booleano, que será verdadeiro ou falso, e a partir desse retorno o movimento da bolinha será alterado conforme o escopo da condição (nesse caso, velocidadeXBolinha *= -1), em dinamismo com as outras funções que já foram estabelecidas ao longo do código.

Espero ter te ajudado a esclarecer essa dúvida, Luiz. Fico à disposição!

Forte abraço.

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

Ajudou muito Larissa, eu estava com essa mesma duvida. tenha um otimo dia.

Muito obrigado, me ajudou muito!

Obrigado, me ajudou bastante.