1
resposta

duas raquetes, vale?

fica aí o código com duas raquetes, uma movida pelas teclas W e S e a outra pelas setas pra cima/baixo. ainda me incomoda que tem a possibilidade da bolinha ficar presa entre a raquete e a borda, ricocheteando várias vezes antes de voltar a atravessar a tela.. alguma dica de como evitar esse bug?

//tamanhos e medidas

  //bolinha
let xBolinha = 300;
let yBolinha = 200;
let diametro = 22;
let raio = diametro / 2;

  //raquetes
let alturaRaquetes = 75;
let larguraRaquetes = 10;
let xRaqueteEsquerda = 10;
let yRaqueteEsquerda = 162;
let xRaqueteDireita = 580;
let yRaqueteDireita = 162;

//movimento

  //bolinha
let velocidadeXbolinha = 8;
let velocidadeYbolinha = 6;
let colidiu = false;

  //raquetes

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

function draw() {
  background(0);
  mostraRaquetes();
  mostraBolinha();
  moveBolinha();
  moveRaqueteEsquerda();
  moveRaqueteDireita();
  //verificaColisaoRaquete();
  verificaColisaoRaqueteEsquerda();
  verificaColisaoRaqueteDireita();
}

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

function mostraRaquetes(){
  rect(xRaqueteEsquerda, yRaqueteEsquerda, larguraRaquetes, alturaRaquetes);
  rect(xRaqueteDireita, yRaqueteDireita, larguraRaquetes, alturaRaquetes);  
}

function moveBolinha(){
  xBolinha += velocidadeXbolinha;
  yBolinha += velocidadeYbolinha;

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

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

function moveRaqueteEsquerda(){
  if (keyIsDown(87)){ //TECLA W
    yRaqueteEsquerda -= 10;
  }
  if (keyIsDown(83)){ //TECLA Sw
    yRaqueteEsquerda += 10;
  }
  if (yRaqueteEsquerda < 0){
    yRaqueteEsquerda = 0;
  }
  if (yRaqueteEsquerda > height - alturaRaquetes){
    yRaqueteEsquerda = height - alturaRaquetes;
  }
}

function moveRaqueteDireita(){
  if (keyIsDown(UP_ARROW)){
    yRaqueteDireita -= 10;
  }
  if (keyIsDown(DOWN_ARROW)){
    yRaqueteDireita += 10;
  }
  if (yRaqueteDireita < 0){
    yRaqueteDireita = 0;
  }
  if (yRaqueteDireita > height - alturaRaquetes){
    yRaqueteDireita = height - alturaRaquetes;
  }
}

function verificaColisaoRaquete(){
  //raquete esquerda
  if (xBolinha - raio < xRaqueteEsquerda + larguraRaquetes &&
     yBolinha + raio > yRaqueteEsquerda &&
     yBolinha - raio < yRaqueteEsquerda + alturaRaquetes){
    velocidadeXbolinha *= -1;
  }
  //raquete direita
  if (xBolinha + raio > xRaqueteDireita &&
      yBolinha + raio > yRaqueteDireita &&
     yBolinha - raio < yRaqueteDireita + alturaRaquetes){
    velocidadeXbolinha *= -1;
  }
}

function verificaColisaoRaqueteEsquerda(){
  colidiu = collideRectCircle(xRaqueteEsquerda, yRaqueteEsquerda, larguraRaquetes, alturaRaquetes, xBolinha, yBolinha, raio);
  if (colidiu){
    velocidadeXbolinha *= -1;
  }
}

function verificaColisaoRaqueteDireita(){
  colidiu = collideRectCircle(xRaqueteDireita, yRaqueteDireita, larguraRaquetes, alturaRaquetes, xBolinha, yBolinha, raio);
  if (colidiu){
    velocidadeXbolinha *= -1;
  }

}
1 resposta

Opa, Caique! Tudo bom?

Desculpe a demora em te dar um retorno sobre esse bug

O que podemos fazer é trazer um pouco essa raquete mais próxima da borda para que a bolinha não entre atrás da raquete.

Só para testar, tente trazer a raquete mais a frente, descolando ainda mais da margem, só para vermos se temos um "problema" na margem. Caso não, segue o plano de deixar mais próximo ;-)

Uma outra maneira é mexermos no tamanho da bolinha, o que pode alterar algum comportamento.

Faça esses testes e me dê um retorno, Caique!

Um abraço