Possuo as seguintes observações a serem feitas:
1) Oponente nunca erra bolinha, bolinha colide sempre no mesmo ponto da raquete do oponente;
1.1) Ao definir como a raquete do oponente irá se mover, pela explicação dada, a variável raqueteComprimento usada na função de movimentaRaqueteOponente deveria ser raqueteAltura, não?
1.2) Independente disto, na função está-se definindo a velocidade do movimento como uma posição com distância fixa da posição da bolinha. O fato de usar a metade do comprimento só faz com que a bolinha fique no meio da raquete, e o -30 aqui não fez tanto sentido porque simplesmente está deslocando a raquete em -30 em seu eixo y, algo que ficará constante. Acredito que a forma mais correta seria que a velocidade da raquete fosse constante e ele tentasse se mover de acordo com o sinal da movimentação vertical da bolinha, não?
1.3) Ressalta-se que no script demonstrado não foi feita checagem quanto a limites máximos de movimento nem da minha raquete, nem da raquete do oponente, quem sabe fosse interessante implementar isto para que as raquetes não passem da área do jogo, por exemplo:
function movimentaMinhaRaquete() {
if (keyIsDown(UP_ARROW) && yRaquete >= 0) {
yRaquete1 -= 10;
} else if (keyIsDown(DOWN_ARROW) && yRaquete <= (height - raqueteAltura)) {
yRaquete1 += 10;
}
}
2) Por que não colocar a verificação do ponto junto da verificação da colisão nas bordas? Por exemplo:
function verificaColisaoBorda() {
if (xBolinha + raio > width) {
// Bateu na borda direita
pontos1++;
velocidadeXBolinha *= -1;
} else if (xBolinha - raio < 0) {
// Bateu na borda esquerda
pontos2++;
velocidadeXBolinha *= -1;
}
if (yBolinha + raio > height || yBolinha - raio < 0) {
velocidadeYBolinha *= -1;
}
}