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

[Dúvida] Duvida na resolução do bug da bolinha presa

Para resolver o bug em aberto no curso logica de programação pong e javascript, usei do seguinte método:

Criei a variável "houvePonto" com o valor 0 cuja sua função seria basicamente servir como switch entre 0 e 1(tipo verdadeiro e falso):

let houvePonto = 0;

Na função "marcaPonto", dentro da estrutura do if, pedi para que o valor da variável "houvePonto" seja = 1 (ou seja, verdadeiro):

function marcaPonto(){
  if (xBolinha > 590) {
    meusPontos += 1;
    houvePonto = 1;
    ponto.play();
  }

  if (xBolinha < 10){
    pontosOponente += 1;
    houvePonto = 1;
    ponto.play();
  }
}

Na função "verificaColisaoRaquete", criei a condição de que se "houvePonto" fosse igual à 0 a função funcionaria normalmente, se não deixaria de funcionar:

function verificaColisaoRaquete(x,y){
  if(houvePonto == 0){
  colidiu = collideRectCircle(x, y, larguraRaquete, alturaRaquete, xBolinha, yBolinha, raioBolinha);
  if (colidiu){
    velocidadeXbolinha *= -1;
    raquetada.play();
  }
  }
  else{
    colidiu = false;
  }

}

E por ultimo criei a função "bolinhaFicaIntangivel" pedindo para que toda vez que a bolinha passasse no centro da tela pelo eixo x, "houvePonto" voltasse a ser 0 para que a função "verificaColisaoRaquete" sempre volte a funcionar:

function bolinhaFicaIntangivel(){
    if(xBolinha == 300){
    houvePonto = 0; 

Fiz os testes e aparentemente tudo funcionou bem, enquanto o valor de "houvePonto" for 1, a bolinha ultrapassa a raquete e resolveu o problema dos pontos múltiplos quando a bolinha fica presa. O problema é: a bolinha continua prendendo atrás da raquete.

Alguém sabe me dizer por que isso continua acontecendo?

3 respostas
solução!

Olá, Caio! Tudo certo?

Ideia excelente! Parabéns pela implementação!

Você trabalhou uma flag e no lugar de 0 e 1, pode tentar um booleano com o valor de true ou false.

No caso do problema em relação ao problema da bolinha presa. Você pode inserir uma nova ação para que a bolinha apareça em outra posição, pode ser bem em frente da raquete, com um xBolinha = 200 por exemplo.

O problema ocorre por conta da lógica de colisão, que reconhece os dois lados da raquete e acaba ricocheteando.

Fico à disposição

Buenas! A soluçao que adotei para a bolinha nao ficar presa foi adicionar mais uma verificaçao no IF da colisao da raquete. No caso da minhaRaquete, para que houvesse a colisao com a raquete adicionei a condiçao da velocidadeX da bolinha ser menor que zero, e na do oponente, que a velocidade fosse maior que zero. Assim, nao tem como rebater quando estiver voltando. Abs

Luciano obrigado pela dica, testei sua lógica e funcionou, porém apenas para a minha raquete, como estou usando a função genérica do libraries do p5js para ambas as raquetes, não da pra fazer a separação minhaRaquete/raqueteOponente (ou não sei como fazer).

Resolvi com a dica da Camila, desisti do método da bolinha intangível, adicionei duas variáveis booleanas "houvePonto" e "houvePontoOponente", uma função para caso elas fossem verdadeiras, a bolinha se deslocaria um pouco a frente do eixo X da raquete e uma função para fazer as variáveis voltarem a ser falsas e a bolinha voltar a se mover. Segue o código:


function switchPonto(){
    if(xBolinha >= 25){
    houvePontoOponente = false;   
  }
  if(xBolinha <= 571){
    houvePonto = false;
  }
}

function bolinhaReaparece(){
  if(houvePonto == true){
    xBolinha = xRaqueteOponente - 12;
  }
  if(houvePontoOponente == true){
    xBolinha = xRaquete + 18;
  }
}

Acho que da pra refatorar mas por enquanto o importante é que funcionou. Obrigado pelas respostas.