Oi gente,
Vim compartilhar uma solução que encontrei para fazer o adversario errar eventualmente e para que a bolinha não fique presa atrás da raquete.
Pra questão do adversário, fiz uma função que considera o número de colisões (tanto em bordas quanto com as raquetes) e a proporção de pontos meus e do oponente:
if (meusPontos + pontosAdversario == 0 ) {
vyAdversario = (yBolinha - yAdversario -altura/2)+contaColisao}
else {
vyAdversario = (yBolinha - yAdversario - altura/2) + contaColisao * (pontosAdversario/(meusPontos+pontosAdversario)) - meusPontos + pontosAdversario}
yAdversario += vyAdversario;
Achei essa solução interessante porque a chance de erro do adversario se adapta ao desempenho do jogador ao longo da partida.
Em relação ao problema da bolinha ficar presa atrás da raquete, encontrei uma solução que considera o vetor da velocidade da bolinha, pois o problema ocorre quanto a bolinha muda de direção estando atrás das raquetes. Então coloquei um condicional no if para que o vxBolinha mude de direção somente quando o vx for positivo, no caso da raquete do adversario, ou negativo, no caso da minha raquete:
function colisaoRaquetes(){
if (xBolinha - raioBolinha == xRaquete + comprimento && yBolinha - raioBolinha < yRaquete + altura && yBolinha + raioBolinha > yRaquete && Math. sign(vxBolinha) == -1){vxBolinha *= -1; raquetada.play(); contaColisao += 1}
if (xBolinha +raioBolinha >= xAdversario && yBolinha - raioBolinha <= yAdversario + altura && yBolinha +raioBolinha >= yAdversario && Math. sign(vxBolinha) == 1) {vxBolinha *= -1; raquetada.play(); contaColisao += 1}
}
Enfim, achei essas soluções e resolvi compartilhar, caso seja útil para alguém.
Abraços,
Carol