Eu percebi que ele ocorria quando a bolinha tocava na parte superior da raquete e que isso deve ser alguma limitação do JavaScript. Então para contornar o Bug da bolinha eu aumentei em 3 pixels a "área de contato" da raquete, sem aumentar seu "objeto", através da verificação de colisão.
function verificaColisaoRaquete() {
if ( xBolinha - raioBolinha < xRaqueteEsq + wRaqueteEsq
&& yBolinha + raioBolinha > yRaqueteEsq - 3
&& yBolinha - raioBolinha < yRaqueteEsq + hRaqueteEsq + 3) {
velocidadeXBolinha *= -1;
raquetada.play();
}
}
let taxaDeErro = 0;
function verificaColisaoRaqueteOponente() {
if ( xBolinha + raioBolinha > xRaqueteDir
&& yBolinha + raioBolinha > yRaqueteDir - 3
&& yBolinha - raioBolinha < yRaqueteDir + hRaqueteDir + 3) {
velocidadeXBolinha *= -1;
raquetada.play();
taxaDeErro = random(-50, 50);
}
}
Perceba que eu também coloquei uma variável "taxaDeErro" que toda vez que a raquete defender, ela vai me gerar um número que será incrementado em seu movimento. Aqui:
function movimentoRaqueteOponente() {
calculaChanceDeErrar();
velocidadeYOponente = yBolinha - yRaqueteDir -
hRaqueteDir / 2 - 30;
yRaqueteDir += velocidadeYOponente + chanceDeErrar + taxaDeErro;
}
Utilizei também uma solução para a bolinha fazendo pontos por trás da raquete aqui do fórum, que ao realizar o ponto, a bolinha volta para a posição à frente da raquete.
function bolinhaPresa(){
if (xBolinha - raioBolinha < 0){
xBolinha = 20;
}
if (xBolinha + raioBolinha > 600){
xBolinha = 580;
}
}
link do p5 >> https://editor.p5js.org/ChicoStuhl/full/A_pcGnLHv
Obs: optei por não utilizar a função de colisão pronta do github.