Gente, recém terminei o FreeWay, e decidi voltar para alterar algumas coisas no Pong e colovar coisas em prática, porque não tinha gostado muito da versão original. Vou detalhar aqui algumas mudanças que fiz pra registrar aqui, bem como as soluções que achei para problemas e o que falta corrigir.
A primeira coisa que fiz foi alterar o movimento da minha raquete para o mouse em vez das setas, pois acho mais fácil de fazer os testes. Acabou que também achei mais divertido de jogar assim, então mantive.
function movimentoPlayer(){ yPlayer=mouseY; yPlayer=constrain(yPlayer,75,height-75); }
Decidi também mudar o movimento do oponente, pois estava achando muito dificil no começo do jogo e muito fácil no final, então pensei em uma solução para fazer a raquete diminuir a velocidade a cada vez que o jogador ou o oponente acertam a bolinha. Para isso, criei uma função que verifica as colisões (utilizando a de antes), e acrescentei uma linha que soma um contador de colisões e outra que divide esse contador por 10.
let colisoes=0;
let multiplicadorColisao=1.5;
function hit(){
colidiuPlayer=collideRectCircle(xPlayer+1,yPlayer-75,larguraPlayer,alturaPlayer,xBola,yBola,raio);
colidiuRival=collideRectCircle(xRival-1,yRival-75,larguraRival,alturaRival,xBola,yBola,raio);
if (colidiuPlayer||colidiuRival){
vBolaX*=-1
colisoes++
multiplicadorColisao+=colisoes/10
}
}
pra finalizar essa parte, mudei a velocidade do oponente:
vRival=(yBola-yRival)/multiplicadorColisao;
Você pode ter notado que eu separei as funções de colisão para o jogador e para o oponente. Fiz isso para tentar contornar o erro de a bolinha "grudar" na raquete, adicionando e subtraindo 1 do x das respectivas raquetes para contar a colisão. Ainda quero pensar em um jeito de junta-las novamente através de parâmetros ou lista, mas por enquanto preferi deixar assim pois minhas tentativas resultaram numa quebra do jogo (bolinha ia para além da borda, ou atravessava as raquetes, ou outros bugs semelhantes). Além disso outra solução que criei e achei interessante, foi a de iniciar com play. essa solução impede que a bola fique presa entre a raquete e a margem, pois toda vez que um ponto é marcado, a bola volta para o lugar inicial e a rodada recomeça. para isso, criei um "botão" (na verdade é só ilustrativo, pois o jogo começa ao clicar em qualquer lugar da tela) de play e fiz o jogo recomeçar a cada ponto:
let botão=1;
let pontosPlayer=0;
let pontosRival=0;
function placar (){
fill(255);
textAlign(CENTER);
textSize(30);
text(pontosPlayer,440,30);
text(pontosRival,640,30);
if(xBola+11>width) {pontosPlayer+=1}
if(xBola-11<0) {pontosRival+=1}
}
function fim(){
if(pontosPlayer>9){
botão=1;
fill(255);
textSize(50);
textAlign(CENTER);
text("YOU WIN!",540,200);
}
if(pontosRival>9){
botão=1;
fill(255);
textSize(50);
textAlign(CENTER);
text("GAME OVER!",540,100);
}
}
depois disso, foi só adicionar a variável botão à função colisão, e dessa forma toda vez que a bolinha toca nas bordas laterais (na verdade a 2px ela, para evitar bug), a variavel muda e o jogo recomeça:
function colisão(){
if (xBola+10>width-2 || xBola-10<2){
xBola=540;
yBola=360;
vBolaY=0;
vBolaX=0;
botão=1;
}
dessa forma, o jogo ficou mais divertido e mais natural na minha opinião. Claro, não está 100% pois o ideal seria achar um jeito de o próprio código ficar sem os bugs em vez de usar esses artifícios, mas ainda assim acho que é um baita progresso. Caso alguem queira sugerir alterações ou adaptar as soluções, vou deixar o código inteiro aqui para darem uma olhada. Algumas variáveis estão com nome diferente da aula, mas está organizado em arquivos para melhor compreensão. https://editor.p5js.org/TortugoBell/sketches/LP5craCa5
PS: também pretendo fazer alterações assim no Freeway. Assim que terminar mandarei aqui no fórum também!