1
resposta

Bolinha Travada no Meio

Boa tarde.

O meu código está com o BUG que a bolinha fica travada no meio e não está se movimentando no eixo "X" , somente no eixo "Y".

Não estou compreendendo onde está o erro e conto com ajuda de vocês.

//variaveis da bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 20;
let raio = diametro / 2;

//velocidade da bolinha
let velocidadexBolinha = 6;
let velocidadeyBolinha = 6;

//variaveis da raquete
let xRaquete = 5;
let yRaquete = 150;
let raqueteComprimento = 10;
let raqueteAltura = 90;

//variaveis da raquete oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;
let velocidadeYOponente;

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

function draw() {
  background(0);
  mostraBolinha();
  movimentaBolinha();
  verificaColisaoBorda();
  mostraRaquete(xRaquete, yRaquete);
  mostraRaquete(xRaqueteOponente, yRaqueteOponente);
  movimentaMinhaRaquete();
  movimentaRaqueteOponente();
  verificaColisaoRaquete(xRaquete, yRaquete);
  verificaColisaoRaquete(xRaqueteOponente, yRaqueteOponente);  
  }

function mostraBolinha(){
circle(xBolinha, yBolinha, diametro);
}

function movimentaBolinha(){
xBolinha += velocidadexBolinha
yBolinha += velocidadeyBolinha
}

function verificaColisaoBorda(){

  // || = OR
  if (xBolinha + raio > width || xBolinha - raio < 0 ){
    velocidadexBolinha *= -1;
  }

  // || = OR
  if (yBolinha + raio > height || yBolinha - raio < 0 ){
    velocidadeyBolinha *= -1;
  }
}

function mostraRaquete(x,y){
  rect(x, y, raqueteComprimento, raqueteAltura)
}

function movimentaMinhaRaquete(){
  if (keyIsDown(UP_ARROW)){
    yRaquete -= 10;
  }
  if (keyIsDown(DOWN_ARROW)){
    yRaquete += 10;
  }
}

function movimentaRaqueteOponente(){
  velocidadeYOponente = yBolinha - yRaqueteOponente - raqueteComprimento / 2 -30;
  yRaqueteOponente += velocidadeYOponente
}

function verificaColisaoRaquete(x,y){
// && = AND
  if (xBolinha - raio < x + raqueteComprimento
      && yBolinha - raio < y + raqueteAltura
       && yBolinha + raio > y){
    velocidadexBolinha *= -1;
  }
}
1 resposta

Oi Annelyse, seu problema está no método que detecta a colisão da bolinha com as raquetes. Da forma como está implementado ele sempre detecta uma colisão mesmo com a volinha no centro, por isso a velocidade sempre é alterada (* -1) dando a falsa impressão de que a bolinha está travada no centro. Da forma como seu código está implementado sugiro que você tente outras alternativas para detectar as colisões entre raquete e bolinha (tem várias formas corretas de fazer essa detecção) Uma sugestão seria definir o método como:


function verificaColisaoRaquete(x,y,player){
  if(player === "op"){
        if ((xBolinha+raio >= x) && (yBolinha-raio >= y) && (yBolinha+raio <= y+raqueteAltura)){
    velocidadexBolinha *= -1; 
          console.log("hit op");
    }
  } else if (player === "pl"){
      if ((xBolinha-raio <= x+raqueteComprimento) && (yBolinha-raio >= y) && (yBolinha+raio <= y+raqueteAltura)){
    velocidadexBolinha *= -1;
        console.log("hit pl");
    }
  }  
}

e na hora de chamar o método informar se você quer detectar a colisão com a raquete do oponente (op) ou do player (pl). Dessa forma:

verificaColisaoRaquete(xRaquete, yRaquete, "pl");
verificaColisaoRaquete(xRaqueteOponente, yRaqueteOponente, "op"); 

Mais uma vez, essa é apenas uma forma de resolver que implementei rapidamente apenas para você testar e ver que o problema é seu método de detecção de colisão. Entretanto, há outras formas mais elegantes e bem melhores de fazer essa detecção de colisão.

Espero ter ajudado.