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

[Bug] Bolinha presa atrás de raquete

Sei que muitos usuários já relataram o mesmo erro. Já tentei seguir a solução apresentada nos casos parecidos mas não surtiu efeito em meu código, pois a bolinha ainda permanece ficando presa atrás da raquete :(

Poderia me ajudar? este é meu código:

//variáveis da bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 20;

//velocidade da bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;
let raio = diametro / 2;

//variáveis da raquete
let xRaquete = 3;
let yRaquete = 150;
let wRaquete = 10;
let hRaquete = 90;

//variáveis do oponente
let xRaqueteOponente = 585;
let yRaqueteOponente = 150;
let velocidadeYOponente;
let chanceDeErrar = 0;
let direcaoRaqueteOponente = 1;

//placar
let meusPontos = 0;
let pontosOponente = 0;

//sons do jogo
let music;
let hit;
let ponto;

function preload (){
  music = loadSound("music.mp3");
  hit = loadSound("hit.mp3");
  ponto = loadSound("ponto.mp3")
}

function setup() {
    createCanvas(600, 400);
    music.loop();
}

function draw() {
    background(0);
    line(300, 0, 300, 400);
    mostraBolinha ();
    movimentaBolinha ();
    verificaColisaoBorda();
    mostraRaquete (xRaquete, yRaquete);
    movimentaMinhaRaquete();
    verificaColisaoRaquete(xRaquete, yRaquete);
    mostraRaquete (xRaqueteOponente, yRaqueteOponente);
    movimentaRaqueteOponente();
    ColisaoRaqueteOponente();
    incluiPlacar ();
    marcaPonto ();
    limiteRaquete ();
}

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

function movimentaBolinha(){
  xBolinha += velocidadeXBolinha;
  yBolinha += velocidadeYBolinha;
}

function verificaColisaoBorda(){
    if (xBolinha + raio > width || 
      xBolinha - raio < 0){
    velocidadeXBolinha *= -1;
      ponto.play();
  }
  if (yBolinha + raio > height ||
      yBolinha - raio < 0){
    velocidadeYBolinha *= -1;
  }
}

function mostraRaquete (x,y){
  fill (color(119,136,153))
      rect(x, y, wRaquete, hRaquete);
}


function movimentaMinhaRaquete(){
  yRaquete = mouseY;
}

function verificaColisaoRaquete (){
  if (xBolinha - raio < xRaquete + wRaquete
     && yBolinha - raio < yRaquete + hRaquete && yBolinha + raio > yRaquete){
    velocidadeXBolinha *= -1;
    hit.play();
  }
}

function ColisaoRaqueteOponente (){
  if(xBolinha + raio > xRaqueteOponente 
   && yBolinha + raio < yRaqueteOponente + hRaquete
   && yBolinha + raio > yRaqueteOponente){
   velocidadeXBolinha *= -1;
   hit.play();
  }
}

function movimentaRaqueteOponente (){
  const mediaYBolinha = yBolinha + raio;
  const mediaYRaqueteOponente = yRaqueteOponente + (hRaquete/2);

  if (mediaYBolinha > mediaYRaqueteOponente) {
    direcaoRaqueteOponente = 1;
  } else {
    direcaoRaqueteOponente = -1;
  }
  yRaqueteOponente += 5 * random(0.55, 0.95) * direcaoRaqueteOponente;
}

function calculaChanceDeErrar() {
  if (pontosOponente >= meusPontos) {
    chanceDeErrar += 1
    if (chanceDeErrar >= 39){
    chanceDeErrar = 40
    }
  } else {
    chanceDeErrar -= 1
    if (chanceDeErrar <= 35){
    chanceDeErrar = 35
    }
  }
}

function incluiPlacar (){
  textAlign (CENTER)
  textSize (16)
  fill (color(138,43,226))
  stroke (255,250,250)
  rect (175, 20, 50, 30, 5)
  rect (375, 20, 50, 30, 5)
  fill (225)
  text (meusPontos, 200, 40);
  text (pontosOponente, 400, 40)
}

function marcaPonto (){
  if (xBolinha > 590) {
    meusPontos +=1;
  }
  if (xBolinha < 10) {
    pontosOponente += 1;
  }
}

function limiteRaquete() {
  if (yRaquete < 0) {
    yRaquete = 0;
  }
  else if (yRaquete > 400 - hRaquete) {
    yRaquete = 400 - hRaquete;
  }
  else if (yRaqueteOponente < 0) {
    yRaqueteOponente = 0;
  }
  else if (yRaqueteOponente > 400 - hRaquete) {
    yRaqueteOponente = 400 - hRaquete;
  }
}

//impede que a bolinha fique presa atrás da raquete
function bolinhaNaoFicaPresa(){
if (xBolinha - raio < 0){
xBolinha = 23
}
}

https://editor.p5js.org/bransodre/sketches/X3qy-KvZC

2 respostas
solução!

Boa noite Hildebrando,

tem uma solução que acho mais simples para evitar que a bolinha fique presa, fazendo com que ela volte para frente da raquete assim que marcar um ponto, dessa forma:

function marcaPonto (){
  if (xBolinha > 590) {
    meusPontos +=1;
    xBolinha = 580;
  }
  if (xBolinha < 10) {
    pontosOponente += 1;
    xBolinha = 20;
  }
}

Obrigado pela ajuda.