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

[Bug] Raquete Bugada

Minha raquete quando entra a bolinha por um angulo especifico na ponta, ela se prende entre o fundo e a parte de tras da raquete, fazendo com que ela se prenta e até consegui trancar ela infinitamente e já conta mais de 30 mil pontos ...kkk

LINK já com mais de 35mil pontos https://prnt.sc/6Htt2_LHp4wI

a seta vermelha indica por onde ela entrou, e na parte de baixo da raquete também acontece, porém a bolinha vem de baixo para cima para funcionar o bug

AJUDA EUUUUUUUU POVOOOOOOOOOO



//~~~~~~~~BOLINHA~~~~~~~~
//posicao inicial da bolinha
let xBolinha = 300;
let yBolinha = 200;


//tamanho da bolinha
let diametro = 20;
let raio = diametro / 2;

//velocidade da bolinha
let velocidade = 6;
let velocidadeXBolinha = velocidade;
let velocidadeYBolinha = velocidade;

//tamanho das raquetes
let raqueteComprimento = 10;
let raqueteAltura = 90;

//Colisao
let colidiu = false;

//Placar do jogo
let pontosRaquete01 = 0;
let pontosRaquete02 = 0;

//~~~~~~~~RAQUETE 01~~~~~~~~
//posicao inicial da raquete
let xRaquete01 = 5;
let yRaquete01 = 150;

//~~~~~~~~RAQUETE 02~~~~~~~~
//posicao inicial da raquete
let xRaquete02 = 585;
let yRaquete02 = 150;
let velocidadeYRaquete02;


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

function draw() {
  background(0); //fundo da tela
  mostraBolinha(); //desenha a bolinha
  movimentaBolinha(); //movimenta a bolinha
  verificaColisaoBorda(); //verifica a colisao da bolinha com as bordas
  mostraRaquete(xRaquete01, yRaquete01);
  verificaColisaoRaquete(xRaquete01, yRaquete01);
  movimentaRaquete01();
  mostraRaquete(xRaquete02, yRaquete02);
  movimentaRaquete02(xRaquete02, yRaquete02);
  verificaColisaoRaquete(xRaquete02, yRaquete02);
  incluirPlacar();
  marcaPonto();

}

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

function movimentaBolinha(){
  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 movimentaRaquete01(){
  if(keyIsDown(UP_ARROW)){
    yRaquete01 -= 10;    
  }
  if(keyIsDown(DOWN_ARROW)){
    yRaquete01 += 10;    
  }
  // Vamos limitar a movimentação da raquete para que ela não ultrapasse as bordas:
    yRaquete01 = constrain(yRaquete01, 5, 305);
}

function movimentaRaquete02(){
  velocidadeYRaquete02 = yBolinha - yRaquete02 - raqueteComprimento / 2 - 30;
  yRaquete02 += velocidadeYRaquete02;
// Vamos limitar a movimentação da raquete para que ela não ultrapasse as bordas:
    yRaquete02 = constrain(yRaquete02, 5, 305);
}

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

function incluirPlacar(){
  fill(255);
  text(pontosRaquete01,278,26);
  text(pontosRaquete02,321,26);
}

function marcaPonto(){
  if (xBolinha > 590){
    pontosRaquete01+=1
  }
  if (xBolinha < 10){
    pontosRaquete02+=1
  }
  }
2 respostas
solução!

Parece que o problema que você está enfrentando com a bolinha ficando presa entre a parte de trás da raquete e o fundo ocorre devido à lógica de colisão utilizada no código.

A colisão está sendo detectada quando a bolinha atinge a parte de trás da raquete, o que faz com que a velocidade horizontal da bolinha seja invertida (velocidadeXBolinha *= -1). Isso causa um efeito de "travamento" quando a bolinha fica entre a raquete e a borda, pois a velocidade horizontal fica sendo invertida repetidamente em cada frame.

Para evitar esse comportamento indesejado, você pode ajustar a lógica de colisão para verificar a colisão apenas com a frente da raquete, em vez de toda a raquete. Assim, a bolinha não vai "travar" entre a raquete e o fundo da tela.

Aqui está a alteração no código para corrigir a colisão:

function verificaColisaoRaquete(x, y) {
  // Verifica colisão com a frente da raquete
  if (xBolinha + raio > x && xBolinha - raio < x + raqueteComprimento &&
      yBolinha + raio > y && yBolinha - raio < y + raqueteAltura) {
    velocidadeXBolinha *= -1;
  }
}

Com essa alteração, a colisão só será detectada quando a bolinha atingir a frente da raquete, e o comportamento de "travamento" deve ser evitado.

Espero que isso ajude a resolver o problema da bolinha ficando presa na raquete. Divirta-se com o seu jogo e continue aprimorando-o!

Valeu, até no final do curso também o pessoal havia colocado como resolver esse bixinho...

Mas ajudou aqui.

Obrigado =D

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