1
resposta

Pong v2.0

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!

1 resposta

Olá, Vitor!

Parabéns por terminar o FreeWay e por decidir fazer alterações no Pong! É ótimo ver que você está colocando em prática o que aprendeu e personalizando o jogo de acordo com suas preferências. Inclusive, adorei jogar haha.

A primeira mudança que você fez, alterando o movimento da raquete para o mouse, parece uma ótima escolha. Além de facilitar os testes, torna o jogo mais divertido de jogar. A função movimentoPlayer() que você criou para isso está bem implementada.

A ideia de mudar o movimento do oponente para tornar o jogo mais equilibrado também é interessante. Ao diminuir a velocidade da raquete do oponente a cada colisão, você está criando um desafio progressivo para o jogador. A função hit() que você criou para verificar as colisões e atualizar o multiplicador de colisão está funcionando corretamente.

A alteração na velocidade do oponente, utilizando a fórmula vRival=(yBola-yRival)/multiplicadorColisao, também parece uma boa solução para ajustar a dificuldade do jogo.

A adição do botão de play e a reinicialização do jogo a cada ponto marcado é uma ótima solução para evitar que a bola fique presa entre a raquete e a margem. A função placar() que você criou para exibir os pontos e a função fim() para verificar o fim do jogo estão bem implementadas.

No geral, suas alterações deixaram o jogo mais divertido e natural, e é muito bom ver seu progresso.

Continue explorando e personalizando seus projetos! Se tiver alguma dúvida sobre o conteúdo, estamos por aqui!

Bons estudos!