2
respostas

[Bug] Comportamentos indesejados

Depois que eu adicionei o "calculaChanceDeErrar" no meu código algumas coisas não funcionaram como deviam, alguns problemas aconteceram e depois de eu fazer algumas mudanças os seguintes erros persistem:

  1. Depois de alguns segundo segundo de jogo a bolinha vai prender na raquete do oponente e não vai soltar mais
  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? Em fim, preciso de ajuda pra deixar o jogo funcional

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

//Velocidade bolinha
let velocidadeXBolinha = 4;
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);
   xBolinha += velocidadeXBolinha;
  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 certo?

Sinto muito pelo seu problema! Para que eu possa executar o seu código, analisá-lo e te ajudar a resolver a situação, poderia deixar aqui o link para o seu projeto completo?

Aguardo o seu retorno para continuarmos. Fico à disposição!

Até logo!

Estou com o mesmo problema, principalmente na parte em que a Bolinha agarra na Raquete.

Conseguiu solucionar

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software