2
respostas

[Bug] A bolinha passa pela borda

A bolinha passa pela borda de vez em quando quando ela está indo para baixo na diagonal do lado esquerdo, e está acima da raquete, ou para cima na diagonal do lado esquerdo e está abaixo da raquete, e quando a raquete "erra" a bolinha e fica abaixo ou acima dela, respectivamente, e quando a bolinha está prestes a bater na borda, ela ignora a borda e vai pra fora da tela, não entendi o porquê, mas logo depois ela volta (cerca de um segundo) indo para a direção contrária a de quando ela sumiu.

//Variáveis da bolinha
let xBo = 300;
let yBo = 200;
let diam = 15;
let raio = diam / 2;

//Velocidade da bolinha
let velXBo = 5;
let velYBo = -5;

//Variáveis das Raquetes
let xRaqE = 7;
let xRaqD = 583;
let yRaq = 170;
let TxRaqs = 10;
let TyRaqs = 60;

function setup() {
  createCanvas(600, 400);
}

function draw() {
  background(0);
  //Bolinha
  ShowBo();
  MoveBo();
  VerifycolisionBo();
  
  //Raquetes
  ShowRa();
  MoveRa();
  VerifycolisionRaq();
}

function ShowBo(){
    circle(xBo, yBo, diam);   
}

function MoveBo(){
  xBo += velXBo;
  yBo += velYBo;
}

function VerifycolisionBo(){
   if (xBo + raio > width || xBo - raio < 0)
    {
      velXBo *= -1;
    }
  
  if (yBo + raio > height || yBo -raio < 0)
    {
      velYBo *= -1;
    }
}

function ShowRa(){
  rect(xRaqE, yRaq, TxRaqs, TyRaqs)
  
  }

function MoveRa(){
  if (keyIsDown(87))
  {
    yRaq -= 8
  }
   
  if (keyIsDown(83))
  {
    yRaq += 8
  }
}

function VerifycolisionRaq(){
  
  //Variáveis da bolinha para a colisão
  let esqBo = xBo - raio;
  let topoBo = yBo - raio;
  let baseBo = yBo + raio;

  //Variáveis da raquete para a colisão
  let dirRaqE = xRaqE + TxRaqs;
  let topoRaqs = yRaq;
  let baseRaqs = yRaq + TyRaqs;
  

  if ( esqBo < dirRaqE && topoBo < baseRaqs && baseBo > topoRaqs)
  {
    velXBo *= -1;
  }
  
}
2 respostas

Olá! Entendo que você está tendo problemas com a bolinha passando pela borda. Isso pode estar acontecendo por causa de um pequeno detalhe na lógica de colisão da bolinha com a raquete.

No seu código, você está verificando se a bolinha colidiu com a raquete apenas olhando para a extremidade esquerda da bolinha e a parte superior e inferior dela. No entanto, em alguns casos, a bolinha pode passar pela raquete antes que a colisão seja detectada. Isso pode acontecer quando a bolinha está se movendo muito rápido, ou quando a taxa de quadros (frame rate) do jogo é baixa.

Para resolver isso, você pode adicionar uma verificação adicional na função VerifycolisionRaq(). Atualmente, você está verificando se a extremidade esquerda da bolinha (esqBo) é menor que a extremidade direita da raquete (dirRaqE), e se a parte superior e inferior da bolinha estão entre a parte superior e inferior da raquete.

No entanto, você também precisa verificar se a parte inferior da bolinha (baseBo) é maior que a parte superior da raquete (topoRaqs) e se a parte superior da bolinha (topoBo) é menor que a parte inferior da raquete (baseRaqs). Isso garante que a bolinha não passe pela raquete quando ela está se movendo rapidamente.

Aqui está como você pode modificar a função VerifycolisionRaq():

function VerifycolisionRaq(){
  
  //Variáveis da bolinha para a colisão
  let esqBo = xBo - raio;
  let topoBo = yBo - raio;
  let baseBo = yBo + raio;

  //Variáveis da raquete para a colisão
  let dirRaqE = xRaqE + TxRaqs;
  let topoRaqs = yRaq;
  let baseRaqs = yRaq + TyRaqs;
  

  if ( esqBo < dirRaqE && topoBo < baseRaqs && baseBo > topoRaqs)
  {
    velXBo *= -1;
  }
}

Essa modificação deve ajudar a evitar que a bolinha passe pela raquete. No entanto, lembre-se de que a detecção de colisão em jogos pode ser um tópico complexo, e pode haver outros fatores em jogo que estão causando o problema que você está vendo.

Espero ter ajudado e bons estudos!

Não entendi, a sua solução esta igual ao meu código.