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

[Bug] Comportamento indesejado

Depois que eu adicionei o calculaChanceDeErrar no meu código as coisas pararam de funcionar. Primeiro a raquete do oponente sumiu visualmente, mas ainda parecia estar funcional, vi alguns post no fórun e concertei isso atribuindo um valor para a variável da chance de errar. Mas o que eu não consigo concertar é que agora 100% das vezes que eu inicio o jogo a bolinha fica presa na raquete do oponente e não solta mais, please ajudinha?

//Variáveis da bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 18;
let raio = diametro / 2;

//Velocidade bolinha
let velocidadeXBolinha = 6;
let velocidadeYBolinha = 6;

//Variáveis da Raquete 1
let xRaquete = 5;
let yRaquete = 150;
let raqueteComprimento = 10;
let raqueteAltura = 90; 

//Variáveis do oponente
let xRaqueteOponente= 585;
let yRaqueteOponente= 150;
let velocidadeYOponente;
let chanceDeErrar = 0

let colidiu = false 

//bordas
 let notaLogicaDeProgramacao = 0 
 
 //placar do jogo
 let meusPontos = 0;
 let pontosOponente = 0;

//sons do jogo
let raquetada;
let trilha;
let ponto;

function preload(){
  trilha = loadSound("trilha.mp3");
  ponto = loadSound("ponto.mp3");
  raquetada = loadSound("raquetada.mp3");
}

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

function draw() {
  background(0);
  mostrabolinha();
  andabolinha();
  verificacolisaoborda();
  mostraRaquete(xRaquete, yRaquete);
  movimentaMinharaquete();
//VerificaColisaoRaquete
  verificaColisaoRaquete(xRaquete, yRaquete);
  mostraRaquete(xRaqueteOponente, yRaqueteOponente);
  movimentaRaqueteOponente()
  verificaColisaoRaquete(xRaqueteOponente, yRaqueteOponente)
  constrain(notaLogicaDeProgramacao, 0, 310); 
  incluiPlacar();
  marcaPonto();
  calculaChanceDeErrar();
  bolinhaNaoFicaPresa();
  
}


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

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

function verificacolisaoborda(){
  
  if (xBolinha + raio > width ||
      xBolinha - raio < 0) {
    velocidadeXBolinha *= -1;
  }
  
  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;
  }
  
  yRaquete = constrain(yRaquete, 0, 310);
  
}


function verificaColisaoRaquete(x, y){
  colidiu = collideRectCircle(x, y, raqueteComprimento, raqueteAltura, xBolinha, yBolinha, raio);
  if (colidiu){
    velocidadeXBolinha *= -1;
    raquetada.play();
  }
}

function movimentaRaqueteOponente(){
  velocidadeYOponente = yBolinha - yRaqueteOponente - raqueteComprimento / 2 - 30
  yRaqueteOponente += velocidadeYOponente + chanceDeErrar
   calculaChanceDeErrar()
  
  yRaqueteOponente = constrain(yRaqueteOponente, 0, 310);
}

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


function bolinhaNaoFicaPresa(){
    if (xBolinha - raio < 0){
    XBolinha = 23
    }
}



function incluiPlacar(){
  stroke(255)
  textAlign (CENTER)
  textSize(16)
 fill(color(131,111,255))
  rect(150, 15, 40, 20)
  fill(255)
  text(meusPontos, 170, 30)
  fill(color(131,111,255))
  rect(450, 15, 40, 20)
  fill(255)
  text(pontosOponente, 470, 30)
}

function marcaPonto(){
  if (xBolinha > 590){
    meusPontos += 1;
    ponto.play();
  }
  if (xBolinha < 10){
    pontosOponente += 1;
    ponto.play();
  }
}
2 respostas

Olá, Caique! Tudo bem?

Pelo código que você compartilhou, identifiquei algumas possíveis soluções para os problemas que você mencionou.

  1. Raquete do oponente sumindo visualmente: Você mencionou que a raquete do oponente sumiu visualmente, mas ainda parecia estar funcional. Isso pode ter ocorrido porque você atribuiu um valor para a variável chanceDeErrar, mas não definiu a variável velocidadeYOponente no início do programa. Para corrigir isso, você pode adicionar a seguinte linha no início do programa, antes da função setup():
let velocidadeYOponente = 0;
  1. Bolinha presa na raquete do oponente: Você mencionou que a bolinha fica presa na raquete do oponente e não solta mais. Isso pode estar acontecendo porque você não está atualizando a posição da bolinha quando ela colide com a raquete do oponente. Para corrigir isso, você pode adicionar a seguinte linha no final da função verificaColisaoRaquete():
xBolinha += velocidadeXBolinha;

Dessa forma, a posição da bolinha será atualizada após a colisão com a raquete do oponente.

Espero que essas sugestões possam te ajudar a resolver os problemas que você está enfrentando. Se tiver mais alguma dúvida, é só perguntar!

Espero ter ajudado e bons estudos!

solução!

Eu resolvi o problema adicionando "xBolinha += velocidadeXBolinha" na verifica colisão raquete, mas outros problemas surgiram:

  1. O mesmo problema se repete depois de alguns segundos jogando
  2. Praticamente sempre que a bolinha encosta na minha raque ela buga a colisão e fica presa por um tempo
  3. Em alguns momentos a bolinha colide no canto, sem ser em minha raquete, e não marca ponto

Detalhe para o primeiro ponto é que a forma em que a raquete do adversário segue a bolinha praticamente faz com que ela sempre colida no canto da raquete, talvez mudar a formula que movimenta a raquete do oponente de forma que a bolinha acerte o meio dela mais vezes ajude?