Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

[Projeto] Fim do Projeto

Adicionei e alterei pequenas coisas, peguei bastante ajuda no fórum e modifiquei meu código para que ficasse o mais próximo do que eu queria.

Entretanto, apesar de procurar algumas soluções, não consegui resolver o bug de colisão da bolinha com as raquetes, então é um problema que aparece constantemente enquanto o jogo roda.

Adoraria ter o feedback de vocês, e aceito qualquer sugestão que possa ajudar a melhorar meu código. link: https://editor.p5js.org/gabrieldeth/sketches/JeriiaA7d

2 respostas
solução!

Olá, Gabriel, tudo bem?

Que bom que você buscou melhorar o seu código, parabéns, isso que vai te fazer crescer como programador!

Notei dois principais bugs que acontecem bastante, não só no seu código:

1 - A bola “cola” na raquete na hora de rebater;

2 - A bola “buga” atrás da raquete e marca muitos pontos;

O legal de desenvolvimentos de jogos é que sempre vão haver mais de uma possibilidade para resolver um mesmo problema, então vou te sugerir algumas abordagens, e você faz como achar melhor, pode ser?

1. A bola “cola” na raquete na hora de rebater!

Percebemos aqui que o problema é na colisão.

Então temos que olhar tanto para a verificaColisao como para verificaColisaoOponente. Podemos perceber que o código original do curso trata colisão como o momento onde o x da bolinha “ultrapassa” a “borda” da raquete.

Você já percebeu que isso só acontece quando a bolinha bate exatamente na quina da raquete? Isso acontece, pois no mundo ideal o nosso if das verificações só acontece uma vez por raquetada. Mas entrando bem na quina a bola consegue ficar em um espaço bem pequeno onde ela ativa esse if várias vezes, daí fazendo aquele zig-zag e aquele barulho chato.

Para resolver podemos fazer um empurrão quase imperceptível na bola sempre que ocorrer a raquetada.

Segue o código abaixo:

function VerificarColisao(){
  if (xBolinha - radius < xRaquete + widRaquete && 
      (yBolinha - radius < yRaquete + heiRaquete) &&
      yBolinha + radius > yRaquete){
    velocidadeXBolinha *= -1;
    xBolinha += (radius + 1);
    raquetada.play();
  }
}

function VerificarColisaoOponente(){
  if (xBolinha + radius > xRaqueteOponente - widRaquete && 
      yBolinha - radius < yRaqueteOponente + heiRaquete &&
      yBolinha + radius > yRaqueteOponente){
    velocidadeXBolinha *= -1;
    xBolinha -= (radius + 1);
    raquetada.play();
  }
}

Quando a gente adiciona (ou subtrai) o radius+1 logo depois de mudar a direção da bolinha, ela vai dar um pequeno salto (praticamente imperceptível para o olho humano) mas o suficiente para garantir que a bolinha não vai cair naquele “limbo” onde ela ativa o if várias vezes.

2. A bola “buga” atrás da raquete e marca muitos pontos!

Uma forma de resolver isso, é quando você computar um gol, a bola volta ao centro. É até uma forma mais justa do jogo se dar, e resolve o problema de marcar muitos pontos.

Para fazer basta que você coloque uma linha que desloca o x da bola para o meio do campo sempre que for gol, tipo assim:

function MarcaPonto(){
  // Foi ponto!
  if (xBolinha > 590){
    meuspontos += 1;
    ponto.play();
    xBolinha = 600/2;
  }

  // Foi ponto!
  if (xBolinha < 13){
    pontosDoOponente += 1;
    ponto.play();
    xBolinha = 600/2;
  }
}

Não esqueça que no JavaScript é uma boa prática começar o as funções com letra minúscula, e daí seguir com o camelCase.

Espero ter te ajudado.

Reforço que estou à disposição para tirar dúvidas.

Abraços.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Perfeito! Os problemas foram resolvidos, além disso, também ajustei as letras nas funções como você sugeriu. Muito obrigado pelas dicas, me ajudaram bastante!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software