Oi, Eduardo! Tudo bom contigo?
Desde já, agradeço a paciência em aguardar uma resposta!
Quando estamos estudando, é comum que nos deparemos com assuntos que exigem um pouco mais da gente. Com os primeiros passos no universo da programação, isso não poderia ser diferente; aos poucos, conforme vamos nos aprofundando, passamos a compreender melhor a lógica por trás das coisas.
A movimentação da raquete do oponente pode ser, em partes, complexa. Então, vamos juntos nessa para entender como isso ocorre?
O p5.js possui um sistema de coordenadas um pouco diferente da Matemática. Compreender como os pontos estão dispostos na tela irá auxiliar no entendimento da movimentação da raquete do oponente. Então, trago aqui um artigo bem bacana da Alura que comenta sobre essa questão, para acessá-lo, basta clicar no link abaixo:
Mas afinal, como movimentaRaqueteOponente()
funciona?
Para que a bolinha não “escape” do oponente, ele, por sua vez, precisa alcançá-la. Por conta disso, o objetivo da função movimentaRaqueteOponente()
é criar uma movimentação para a raquete do oponente que tenha como principal característica acompanhar o movimento da bolinha, ou seja, se a bolinha faz uma movimentação com direção para cima, a raquete se moverá para cima, se a bolinha faz uma movimentação com direção para baixo, a raquete se movimenta para baixo.
Para um melhor entendimento do que está ocorrendo, podemos substituir a variável velocidadeYOponente
por deslocamentoYRaqueteOponente
, pois o que de fato altera-se no jogo é a posição vertical da raquete.
Sabendo as motivações por trás da função, precisamos, agora, compreender as variáveis utilizadas e seus significados:
yBolinha
: é a posição vertical do ponto central da bolinha;yRaqueteOponente
: coordenada correspondente à parte superior da raquete do oponente. No p5.js, para a formação de um desenho, como um retângulo, precisamos passar os pontos iniciais. Neste caso, yRaqueteOponente
é este ponto inicial;raqueteComprimento
: variável que armazena o tamanho da raquete.
Sabendo isso, podemos pensar sobre o deslocamento da raquete, conforme a movimentação da bolinha. Se o objetivo é acompanhá-la, poderíamos fazer com que a variável deslocamentoYRaqueteOponente
receba o valor atual de yBolinha
. Com isso, teríamos algo assim:
function movimentaRaqueteOponente(){
deslocamentoYRaqueteOponente = yBolinha
yRaqueteOponente += velocidadeYOponente;
}
No entanto, ao testarmos o código acima, percebemos que ele, na realidade, ele não funciona. Os valores de yRaqueteOponente
passam a ser tão altos que ultrapassam os valores limites da tela do p5.js, portanto, nem conseguimos visualizar a raquete. Logo, precisamos normalizar esse valor para algo dentro das dimensões da tela e que condiga com a posição da bolinha. O primeiro ponto para a normalização é subtrair o valor de yBolinha
por yRaqueteOponente
. Com essa operação, velocidadeYOponente
passa a ter um valor reduzido (que não ultrapassa os limites da tela). Veja como fica com tal modificação:
deslocamentoYRaqueteOponente = yBolinha - yRaqueteOponente;
Ao testarmos o código, percebemos que, quando a bolinha sobe, a raquete sobe, quando a bolinha desce, a raquete desce.
Contudo, ainda não chegamos ao resultado esperado; a bolinha, ao invés de bater no centro da raquete, realiza a colisão somente na parcela superior. Para configurar isso, podemos adicionar mais um trecho na operação:
deslocamentoYRaqueteOponente = yBolinha - yRaqueteOponente - raqueteComprimento / 2 - 30;
O trecho adicionado, embora diferente da lógica do Scratch, foi utilizado somente porque se encaixou ao que se estava desejando. Após alguns testes realizados pelo instrutor, foi possível perceber que - raqueteComprimento / 2 - 30
faria com que a bolinha colidisse com a parte central da raquete.
Pode parecer um pouco frustrante, mas, ao lidar com criação de jogos e outros projetos de programação, às vezes precisamos fazer uso da “tentativa e erro”. Neste caso, para a elaboração do código da movimentação da raquete, houve algo semelhante a isso.
Uma outra maneira de executar o mesmo princípio seria alterando - raqueteComprimento / 2 - 30
por - raqueteAltura/2
. No desenvolvimento de um programa, existem múltiplas possibilidades que podemos seguir. Pensar em diferentes alternativas nos ajuda a compreender melhor como a lógica de programação funciona.
Espero que tenha compreendido como funciona a movimentação da raquete. Estou aqui caso ainda tenha algum questionamento!
Até mais, Eduardo!
Caso este post tenha lhe ajudado, por favor, marcar como solucionado! ✓.