Em relação ao bug que acontece no p5, parece que é o mesmo que o do scratch. Infelizmente eu não descobri o motivo do bug e nem como corrigir ele . Só sei que tem alguma relação com o fato da bolinha tocar os lados do retângulo(parte de cima e de baixo) e também descobri uma forma de pelo menos amenizar a situação.
Imagem ilustrativa dos lados do retângulo:
Para amenizar o problema eu criei uma nova função:
Dentro da função eu criei este código:
Explicação: Em resumo este código vai fazer com que a bolinha seja "teletransportada para fora" caso o ponto mais a esquerda da bolinha(xBolinha-raio) ultrapasse a raquete(xRaquete).Isso acontece porque temos duas condições que fazem com que a bolinha precise estar na área da raquete para que esse processo se realize:
- yBolinha - raio < yRaquete + alturaRaquete &&
- yBolinha + raio > yRaquete
Repare que estes dois segmentos foram os mesmos utilizados pelo professor na aula que ele ensina a função verificaColisaoRaquete().
A única coisa que mudou foi que em vez de xBolinha - raio < xRaquete + larguraRaquete temos xBolinha - raio < xRaquete. Isto porque o xBolinha - raio < xRaquete + larguraRaquete se refere a face direita da raquete(onde a bolinha toca) e no xBolinha - raio < xRaquete se refere a face esquerda ( onde a bolinha só toca se ela estiver bugada). Com isso este código vai "teletransportar" a bolinha quando ela ficar bugada um pouco para fora multiplicando o valor da velocidadeXBolinha por 3:
Obs: Este código me ajudou bastante mas não é perfeito.Ele também impede que a bolinha saia para fora da tela quando ela entra atrás da raquete . Dependendo de como está seu código talvez você tenha que mecher na parte de xBolinha *=3 . Você pode colocar para ela aparecer no meio ou em qualquer outro lugar adicionando valores a x.Eu também utilizei este código somente em uma das raquetes porque ainda não cheguei na parte da raquete do oponente ,mas acredito que de certa forma é o mesmo princípio.