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

Algúem pelamor de deus me ajuda entender a lógica da função que movimenta a raquete do oponente (já li todas as respostas dos tópicos sobre isso)

Vamos lá...

No Scratch a lógica era de utilizar a posição y da bolinha e jogar uma margem de erro para o oponente errar. Beleza, isso tá claro.

Agora aqui no p5js, eu não estou conseguindo entender. Eu entendi que que a altura da raquete é dividade por 2 para a bolinhar acertar o centro dela, entendi que a subtração dos 30 é para dar aquela margem de erro para o oponente.

Quando entrou a parte de subtraur o y da raquete do oponente, fiquei com muita dificuldade de entender. Tanta que começa até a complicar a parte que entendi.

então, vamos à operação dessa lógica:

** velocidadeYOponente = yBolinha - yRaqueteOponente - raqueteAltura / 2 - 30; yRaqueteOponente += velocidadeYOponente;**

Já vou adiantar aqui a explicação que a Camila usou para ajudar os demais, mas ja vou me adiantar e fazer os questionamentos em cima dela:

"Na função estamos indicando que velocidadeYOponente receberá ( = ) a posição Y da bolinha, subtraída ( - ) da posição Y da raquete do oponente (Por que subtraímos Y da raquete do oponente?) e a altura da raquete (raqueteComprimento) (Por que fazemos essa subtração em cima da outra?), para que a bolinha sempre toque em algum ponto da raquete do oponente.

A partir dessa parte da explicação, eu entendi mas sem compreender como ela se ralaciona com a parte anterior: Este valor será dividido por 2 (que significa que a bolinha irá tocar na metade da raquete) e, ainda, subtrairemos 30 (- 30) (ou seja, vai tocar em um ponto menor e específico da raquete do oponente)."

Eu entendo e consigo interpretar o plano cartesiano, mas não consigo entender a lógica. Eu entendi como se faz, mas não a lógica. Fiz teste de mesa adotando a posição y da bolinha como 200 e o padrão da criação da raquete Y como 150, igual ao código.

velocidadeYOponente = 200(yBolinha) - 150(yRaqueteOponente) - 90(raqueteComprimento) / 2 - 30 velocidadeYOponente = 200 - 150 - 45 - 30 velocidadeYOponente = -25 yRaqueteOponente += velocidadeYOponente = 150 - 25 = 125

aí, beleza, fiz as contas, cheguei nisso, mas não consigo entender.

Juro que é a primeira dúvida cabeluda que estou tendo sobre a lógica em si. Peço encarecidamente uma resposta bem clara da maneira mais simples possível. Se eu não sanar essa dúvida, vou passar mal kkkk

3 respostas
solução!

Oi Guilherme, tudo bem?

Então, realmente na videoaula ficou meio confuso a lógica que o Prof. utilizou, mas vamos ver se eu consigo lhe esclarecer.

Essencialmente o objetivo da expressão "yBolinha - yRaqueteOponente - raqueteAltura / 2 - 30" é definir o quanto que o raquete do oponente vai ter que andar para se alinhar a bola.

Esse tanto que a raquete do oponente vai ter que andar é calculado realizando a diferença entre a posição da bola e a posição da raquete do oponente.

Uma forma mais clara de representar essa lógica seria assim:

let posicaoYRaqueteOponente = yRaqueteOponente + (alturaRaquete / 2) + 30;

velocidadeYOponente = posicaoYBola - posicaoYRaqueteOponente;

Agora vamos entender a parte da "posicaoYRaqueteOponente".

O "yRaqueteOponente" representa a coordenada Y da raquete do oponente, porém esta coordenada Y não representa o centro da raquete. No p5 js, assim como o plano cartesiano do "createCanvas()", os retângulos são construídos de cima para baixo e da esquerda para a direita, sendo assim a coordenada Y do "yRaqueteOponente" na realidade representa a extremidade de cima da raquete.

Para chegar, então, no centro do eixo Y da raquete, seguindo a lógica do plano cartesiano do p5 js, nós temos que adicionar ao "yRaqueteOponente" um valor que corresponda a metade da altura da raquete, por isso é feito o "(alturaRaquete / 2)". Ou seja, imagine que o topo da raquete esteja tocando o ponto y 100. A raquete tem 100 pontos de altura. Logo, seguindo o mesmo estilo de plano cartesiano do p5 js, sabemos que o seu fundo estará tocando o ponto y 200. Entre o ponto y 100 e o ponto y 200 podemos facilmente deduzir que o ponto central entre eles é o ponto y 150, logo podemos concluir que o centro do eixo Y dessa raquete esta alinhado com o ponto y 150.

Por fim, o "30", como o Prof. explicou, é simplesmente um valor que ele adicionou para que a raquete tenha uma margem de erro em relação a coordenada Y da bola.

Agora porque na resolução da aula o Prof. subtraiu tudo? É basicamente por questão de matemática.

Como eu coloquei no código acima, a operação que temos que realizar é essa: posicaoYBola - posicaoYRaqueteOponente.

Realizando a substituição do "posicaoYRaqueteOponente", essa operação se equivale a essa: posicaoYBola - (yRaqueteOponente + (alturaRaquete / 2) + 30).

Como "yRaqueteOponente + (alturaRaquete / 2) + 30" estão todos agrupados/dentro de um parêntese, quando o "posicaoYBola" for subtrair esse grupo, tudo que for positivo passa a ser negativo (e tudo que for negativo passa a ser positivo, jogo de sinal).

Ou seja, a operação anterior equivale a essa: posicaoYBola - yRaqueteOponente - (alturaRaquete / 2) - 30.

Na programação, assim como na matemática, as operações de multiplicação e divisão tem prioridade de resolução acima da soma e subtração, por conta disso o parentese do "(alturaRaquete / 2)" pode ser removido.

No final de tudo, então, a operação pode ser resumida a: posicaoYBola - yRaqueteOponente - alturaRaquete / 2 - 30. Da mesma forma como o Prof. colocou.

Até ai então eu acho que já dá pra entender o resto da função.

Espero ter esclarecido os porquês da expressão que o Prof. utilizou.

Se não entendeu alguma parte pode falar que eu tento explicar melhor.

Fala Julio! Tudo belezinha aqui, espero que por aí também.

Meu caro, na moral, não sei nem como te agradecer. Eu estava pirando com essa dúvida, postei muito ela aqui e no discord e nada. O engraçado é que depois que vc deu essa explicação, o que estava me tirando do sério começou a parecer uma coisinha tão besta. Minha interepretação para o propósito dessa operação estava completamente diferente e vc conseguiu dar esse direcionamento, então consegui ver claramente pela perspectiva que me passou.

Novamente, muito obrigado mesmo!!! Olha o tamanho dessa explicação, como detalhou bacana. Realmente, agradeço muito por esse empenho e pelo seu tempo!

E no que precisar, estamos aí viu!

Legal Guilherme, fico feliz que eu tenha conseguido te ajudar :)